Make WordPress Core

Ticket #45067: 45067.diff

File 45067.diff, 4.5 KB (added by peterwilsoncc, 6 years ago)
  • src/wp-includes/kses.php

    diff --git src/wp-includes/kses.php src/wp-includes/kses.php
    index 0cf4ce14c4..fde35e8638 100644
    function wp_kses_one_attr( $string, $element ) { 
    549549        $allowed_html = wp_kses_allowed_html( 'post' );
    550550        $allowed_protocols = wp_allowed_protocols();
    551551        $string = wp_kses_no_null( $string, array( 'slash_zero' => 'keep' ) );
    552        
     552
    553553        // Preserve leading and trailing whitespace.
    554554        $matches = array();
    555555        preg_match('/^\s*/', $string, $matches);
    function wp_kses_one_attr( $string, $element ) { 
    561561        } else {
    562562                $string = substr( $string, strlen( $lead ), -strlen( $trail ) );
    563563        }
    564        
     564
    565565        // Parse attribute name and value from input.
    566566        $split = preg_split( '/\s*=\s*/', $string, 2 );
    567567        $name = $split[0];
    function wp_kses_one_attr( $string, $element ) { 
    598598                $value = '';
    599599                $vless = 'y';
    600600        }
    601        
     601
    602602        // Sanitize attribute by name.
    603603        wp_kses_attr_check( $name, $value, $string, $vless, $element, $allowed_html );
    604604
    function wp_kses_attr_parse( $element ) { 
    10621062        } else {
    10631063                $xhtml_slash = '';
    10641064        }
    1065        
     1065
    10661066        // Split it
    10671067        $attrarr = wp_kses_hair_parse( $attr );
    10681068        if ( false === $attrarr ) {
    function wp_kses_attr_parse( $element ) { 
    10721072        // Make sure all input is returned by adding front and back matter.
    10731073        array_unshift( $attrarr, $begin . $slash . $elname );
    10741074        array_push( $attrarr, $xhtml_slash . $end );
    1075        
     1075
    10761076        return $attrarr;
    10771077}
    10781078
    function wp_kses_check_attr_val($value, $vless, $checkname, $checkvalue) { 
    12151215 * @param array  $allowed_protocols Allowed protocols to keep
    12161216 * @return string Filtered content
    12171217 */
    1218 function wp_kses_bad_protocol($string, $allowed_protocols) {
    1219         $string = wp_kses_no_null($string);
     1218function wp_kses_bad_protocol( $string, $allowed_protocols = array() ) {
     1219        if ( empty( $allowed_protocols ) ) {
     1220                $allowed_protocols = wp_allowed_protocols();
     1221        }
     1222        $string     = wp_kses_no_null( $string );
    12201223        $iterations = 0;
    12211224
    12221225        do {
    function safecss_filter_attr( $css, $deprecated = '' ) { 
    16931696        $css = wp_kses_no_null($css);
    16941697        $css = str_replace(array("\n","\r","\t"), '', $css);
    16951698
    1696         if ( preg_match( '%[\\\\(&=}]|/\*%', $css ) ) // remove any inline css containing \ ( & } = or comments
    1697                 return '';
    1698 
    16991699        $css_array = explode( ';', trim( $css ) );
    17001700
    17011701        /**
    function safecss_filter_attr( $css, $deprecated = '' ) { 
    17101710        $allowed_attr = apply_filters( 'safe_style_css', array(
    17111711                'background',
    17121712                'background-color',
     1713                'background-image',
    17131714
    17141715                'border',
    17151716                'border-width',
    function safecss_filter_attr( $css, $deprecated = '' ) { 
    17781779                'list-style-type',
    17791780        ) );
    17801781
    1781         if ( empty($allowed_attr) )
     1782
     1783        /*
     1784         * CSS attributes that accept URL data types.
     1785         *
     1786         * This is in accordance to the CSS spec and unrelated to
     1787         * the sub-set of supported attributes above.
     1788         *
     1789         * See: https://developer.mozilla.org/en-US/docs/Web/CSS/url
     1790         */
     1791        $css_url_data_types = array(
     1792                'background',
     1793                'background-image',
     1794
     1795                'cursor',
     1796
     1797                'list-style',
     1798                'list-style-image',
     1799        );
     1800
     1801        if ( empty( $allowed_attr ) ) {
    17821802                return $css;
     1803        }
    17831804
    17841805        $css = '';
    17851806        foreach ( $css_array as $css_item ) {
    17861807                if ( $css_item == '' )
    17871808                        continue;
    1788                 $css_item = trim( $css_item );
    1789                 $found = false;
     1809                $css_item        = trim( $css_item );
     1810                $css_test_string = $css_item;
     1811                $found           = false;
     1812                $url_attr        = false;
    17901813                if ( strpos( $css_item, ':' ) === false ) {
    17911814                        $found = true;
    17921815                } else {
    1793                         $parts = explode( ':', $css_item );
    1794                         if ( in_array( trim( $parts[0] ), $allowed_attr ) )
     1816                        $parts = explode( ':', $css_item, 2 );
     1817                        if ( in_array( trim( $parts[0] ), $allowed_attr ) ) {
    17951818                                $found = true;
     1819                        }
     1820                        if ( $found && in_array( trim( $parts[0] ), $css_url_data_types, true ) ) {
     1821                                $url_attr = true;
     1822                        }
     1823                }
     1824                if ( $found && $url_attr ) {
     1825                        // Simplified: matches the sequence `url(*)`.
     1826                        preg_match_all( '/url\(\s*([^)]+)\s*\)/', $parts[1],$url_matches );
     1827                        foreach ( $url_matches[1] as $url_match ) {
     1828                                // Extract URL from each of the matches above.
     1829                                preg_match( '/^([\'\"]?)\s*(.*)\s*(\g1)$/', $url_match, $url_pieces );
     1830                                if ( empty( $url_pieces ) || $url_pieces[1] !== wp_kses_bad_protocol( $url_pieces[1] ) ) {
     1831                                        $found = false;
     1832                                        break;
     1833                                } else {
     1834                                        $css_test_string = str_replace( $url_match, '', $css_test_string );
     1835                                }
     1836                        }
    17961837                }
    1797                 if ( $found ) {
    1798                         if( $css != '' )
     1838                if ( $found && ! preg_match( '%[\\\(&=}]|/\*%', $css_test_string ) ) {
     1839                        if ( $css != '' ) {
    17991840                                $css .= ';';
     1841                        }
    18001842                        $css .= $css_item;
    18011843                }
    18021844        }