WordPress.org

Make WordPress Core

Ticket #9602: 9602.patch

File 9602.patch, 2.9 KB (added by hakre, 6 years ago)

Corrected Patch, Substition established with preg_replace_callback and a helper class.

  • wp-includes/classes.php

     
    214214 
    215215                                        // Trim the query of everything up to the '?'. 
    216216                                        $query = preg_replace("!^.+\?!", '', $query); 
    217  
    218217                                        // Substitute the substring matches into the query. 
    219                                         eval("@\$query = \"" . addslashes($query) . "\";"); 
     218                                        $query = addslashes(WP_MatchesMapRegex::exec($query, $matches)); 
    220219 
    221220                                        $this->matched_query = $query; 
    222221 
     
    15921591        } 
    15931592} 
    15941593 
     1594/** 
     1595 * WP_MatchesMapRegex 
     1596 *   
     1597 * helper class to prevent the usage of eval to replace $matches[] in query strings. 
     1598 */ 
     1599class WP_MatchesMapRegex { 
     1600        /** 
     1601         * store for matches 
     1602         *  
     1603         * @access private 
     1604         * @var array 
     1605         */ 
     1606        var $_matches; 
     1607         
     1608        /** 
     1609         * store for mapping result 
     1610         *  
     1611         * @access public 
     1612         * @var string 
     1613         */ 
     1614        var $output; 
     1615         
     1616        /** 
     1617         * subject to perform mapping on (query string containing $matches[] references 
     1618         *  
     1619         * @access private 
     1620         * @var string 
     1621         */ 
     1622        var $_subject; 
     1623         
     1624        /** 
     1625         * regexp pattern to match $matches[] references  
     1626         *  
     1627         * @var string 
     1628         */ 
     1629        var $_pattern = '(\$matches\[[1-9]+[0-9]*\])'; // magic number 
     1630         
     1631        /** 
     1632         * constructor 
     1633         *  
     1634         * @param string $subject subject if regex 
     1635         * @param array  $matches data to use in map 
     1636         * @return self 
     1637         */                                              
     1638        function WP_MatchesMapRegex($subject, $matches) { 
     1639                $this->_subject = $subject; 
     1640                $this->_matches = $matches; 
     1641                $this->output = $this->_map();                           
     1642        } 
     1643         
     1644        /** 
     1645         * Substitute substring matches in subject. 
     1646         *  
     1647         * static helper function to ease use 
     1648         *  
     1649         * @access public 
     1650         * @param string $subject subject 
     1651         * @param array  $matches data used for subsitution 
     1652         * @return string 
     1653         */ 
     1654        function exec($subject, $matches) { 
     1655                $oSelf =& new WP_MatchesMapRegex($subject, $matches); 
     1656                return $oSelf->output;                                                                                                                           
     1657        } 
     1658         
     1659        /** 
     1660         * do the actual mapping  
     1661         *  
     1662         * @access private 
     1663         * @return string 
     1664         */ 
     1665        function _map() { 
     1666                $callback = array(&$this, 'callback'); 
     1667                return preg_replace_callback($this->_pattern, $callback, $this->_subject); 
     1668        } 
     1669         
     1670        /** 
     1671         * preg_replace_callback hook 
     1672         *  
     1673         * @access public 
     1674         * @param  array $matches preg_replace regexp matches 
     1675         * @return string 
     1676         */ 
     1677        function callback($matches) { 
     1678                return $this->_matches[intval(substr($matches[0], 9, -1))]; 
     1679        } 
     1680         
     1681} 
     1682 
    15951683?> 
  • wp-includes/rewrite.php

     
    299299                        $query = preg_replace("!^.+\?!", '', $query); 
    300300 
    301301                        // Substitute the substring matches into the query. 
    302                         eval("\$query = \"" . addslashes($query) . "\";"); 
     302                        $query = addslashes(WP_MatchesMapRegex::exec($query, $matches)); 
    303303                        // Filter out non-public query vars 
    304304                        global $wp; 
    305305                        parse_str($query, $query_vars);