WordPress.org

Make WordPress Core

Ticket #20210: 20210.4.diff

File 20210.4.diff, 13.1 KB (added by ryan, 2 years ago)

Run _wp_add_global_attributes() one time only. Handle an array being passed to wp_kses_allowed_html().

  • wp-includes/kses.php

     
    5151        $allowedposttags = array( 
    5252                'address' => array(), 
    5353                'a' => array( 
    54                         'class' => true, 
    5554                        'href' => true, 
    56                         'id' => true, 
    57                         'title' => true, 
    5855                        'rel' => true, 
    5956                        'rev' => true, 
    6057                        'name' => true, 
    6158                        'target' => true, 
    6259                ), 
    63                 'abbr' => array( 
    64                         'class' => true, 
    65                         'title' => true, 
     60                'abbr' => array(), 
     61                'acronym' => array(), 
     62                'area' => array( 
     63                        'alt' => true, 
     64                        'coords' => true, 
     65                        'href' => true, 
     66                        'nohref' => true, 
     67                        'shape' => true, 
     68                        'target' => true, 
    6669                ), 
    67                 'acronym' => array( 
    68                         'title' => true, 
    69                 ), 
    7070                'article' => array( 
    7171                        'align' => true, 
    72                         'class' => true, 
    7372                        'dir' => true, 
    7473                        'lang' => true, 
    75                         'style' => true, 
    7674                        'xml:lang' => true, 
    7775                ), 
    7876                'aside' => array( 
    7977                        'align' => true, 
    80                         'class' => true, 
    8178                        'dir' => true, 
    8279                        'lang' => true, 
    83                         'style' => true, 
    8480                        'xml:lang' => true, 
    8581                ), 
    8682                'b' => array(), 
    8783                'big' => array(), 
    8884                'blockquote' => array( 
    89                         'id' => true, 
    9085                        'cite' => true, 
    91                         'class' => true, 
    9286                        'lang' => true, 
    9387                        'xml:lang' => true, 
    9488                ), 
    95                 'br' => array ( 
    96                         'class' => true, 
    97                 ), 
     89                'br' => array (), 
    9890                'button' => array( 
    9991                        'disabled' => true, 
    10092                        'name' => true, 
     
    10395                ), 
    10496                'caption' => array( 
    10597                        'align' => true, 
    106                         'class' => true, 
    10798                ), 
    10899                'cite' => array ( 
    109                         'class' => true, 
    110100                        'dir' => true, 
    111101                        'lang' => true, 
    112102                        'title' => true, 
    113103                ), 
    114                 'code' => array ( 
    115                         'style' => true, 
    116                 ), 
     104                'code' => array (), 
    117105                'col' => array( 
    118106                        'align' => true, 
    119107                        'char' => true, 
    120108                        'charoff' => true, 
    121109                        'span' => true, 
    122110                        'dir' => true, 
    123                         'style' => true, 
    124111                        'valign' => true, 
    125112                        'width' => true, 
    126113                ), 
     
    130117                'dd' => array(), 
    131118                'details' => array( 
    132119                        'align' => true, 
    133                         'class' => true, 
    134120                        'dir' => true, 
    135121                        'lang' => true, 
    136122                        'open' => true, 
    137                         'style' => true, 
    138123                        'xml:lang' => true, 
    139124                ), 
    140125                'div' => array( 
    141126                        'align' => true, 
    142                         'class' => true, 
    143127                        'dir' => true, 
    144128                        'lang' => true, 
    145                         'style' => true, 
    146129                        'xml:lang' => true, 
    147130                ), 
    148131                'dl' => array(), 
     
    151134                'fieldset' => array(), 
    152135                'figure' => array( 
    153136                        'align' => true, 
    154                         'class' => true, 
    155137                        'dir' => true, 
    156138                        'lang' => true, 
    157                         'style' => true, 
    158139                        'xml:lang' => true, 
    159140                ), 
    160141                'figcaption' => array( 
    161142                        'align' => true, 
    162                         'class' => true, 
    163143                        'dir' => true, 
    164144                        'lang' => true, 
    165                         'style' => true, 
    166145                        'xml:lang' => true, 
    167146                ), 
    168147                'font' => array( 
     
    172151                ), 
    173152                'footer' => array( 
    174153                        'align' => true, 
    175                         'class' => true, 
    176154                        'dir' => true, 
    177155                        'lang' => true, 
    178                         'style' => true, 
    179156                        'xml:lang' => true, 
    180157                ), 
    181158                'form' => array( 
     
    189166                ), 
    190167                'h1' => array( 
    191168                        'align' => true, 
    192                         'class' => true, 
    193                         'id'    => true, 
    194                         'style' => true, 
    195169                ), 
    196170                'h2' => array ( 
    197171                        'align' => true, 
    198                         'class' => true, 
    199                         'id'    => true, 
    200                         'style' => true, 
    201172                ), 
    202173                'h3' => array ( 
    203174                        'align' => true, 
    204                         'class' => true, 
    205                         'id'    => true, 
    206                         'style' => true, 
    207175                ), 
    208176                'h4' => array ( 
    209177                        'align' => true, 
    210                         'class' => true, 
    211                         'id'    => true, 
    212                         'style' => true, 
    213178                ), 
    214179                'h5' => array ( 
    215180                        'align' => true, 
    216                         'class' => true, 
    217                         'id'    => true, 
    218                         'style' => true, 
    219181                ), 
    220182                'h6' => array ( 
    221183                        'align' => true, 
    222                         'class' => true, 
    223                         'id'    => true, 
    224                         'style' => true, 
    225184                ), 
    226185                'header' => array( 
    227186                        'align' => true, 
    228                         'class' => true, 
    229187                        'dir' => true, 
    230188                        'lang' => true, 
    231                         'style' => true, 
    232189                        'xml:lang' => true, 
    233190                ), 
    234191                'hgroup' => array( 
    235192                        'align' => true, 
    236                         'class' => true, 
    237193                        'dir' => true, 
    238194                        'lang' => true, 
    239                         'style' => true, 
    240195                        'xml:lang' => true, 
    241196                ), 
    242197                'hr' => array ( 
    243198                        'align' => true, 
    244                         'class' => true, 
    245199                        'noshade' => true, 
    246200                        'size' => true, 
    247201                        'width' => true, 
    248202                ), 
    249                 'i' => array(), 
     203                'i' => array (), 
    250204                'img' => array( 
    251205                        'alt' => true, 
    252206                        'align' => true, 
    253207                        'border' => true, 
    254                         'class' => true, 
    255208                        'height' => true, 
    256209                        'hspace' => true, 
    257210                        'longdesc' => true, 
    258211                        'vspace' => true, 
    259212                        'src' => true, 
    260                         'style' => true, 
     213                        'usemap' => true, 
    261214                        'width' => true, 
    262215                ), 
    263216                'ins' => array( 
    264217                        'datetime' => true, 
    265218                        'cite' => true, 
    266219                ), 
    267                 'kbd' => array(), 
     220                'kbd' => array (), 
    268221                'label' => array( 
    269222                        'for' => true, 
    270223                ), 
     
    273226                ), 
    274227                'li' => array ( 
    275228                        'align' => true, 
    276                         'class' => true, 
    277229                ), 
     230                'map' => array( 
     231                        'name' => true, 
     232                ), 
    278233                'menu' => array ( 
    279                         'class' => true, 
    280                         'style' => true, 
    281234                        'type' => true, 
    282235                ), 
    283236                'nav' => array( 
    284237                        'align' => true, 
    285                         'class' => true, 
    286238                        'dir' => true, 
    287239                        'lang' => true, 
    288                         'style' => true, 
    289240                        'xml:lang' => true, 
    290241                ), 
    291242                'p' => array( 
    292                         'class' => true, 
    293243                        'align' => true, 
    294244                        'dir' => true, 
    295245                        'lang' => true, 
    296                         'style' => true, 
    297246                        'xml:lang' => true, 
    298247                ), 
    299248                'pre' => array( 
    300                         'style' => true, 
    301249                        'width' => true, 
    302250                ), 
    303251                'q' => array( 
     
    305253                ), 
    306254                's' => array(), 
    307255                'span' => array ( 
    308                         'class' => true, 
    309256                        'dir' => true, 
    310257                        'align' => true, 
    311258                        'lang' => true, 
    312                         'style' => true, 
    313                         'title' => true, 
    314259                        'xml:lang' => true, 
    315260                ), 
    316261                'section' => array( 
    317262                        'align' => true, 
    318                         'class' => true, 
    319263                        'dir' => true, 
    320264                        'lang' => true, 
    321                         'style' => true, 
    322265                        'xml:lang' => true, 
    323266                ), 
    324                 'small' => array(), 
    325                 'strike' => array(), 
    326                 'strong' => array(), 
    327                 'sub' => array(), 
     267                'small' => array (), 
     268                'strike' => array (), 
     269                'strong' => array (), 
     270                'sub' => array (), 
    328271                'summary' => array( 
    329272                        'align' => true, 
    330                         'class' => true, 
    331273                        'dir' => true, 
    332274                        'lang' => true, 
    333                         'style' => true, 
    334275                        'xml:lang' => true, 
    335276                ), 
    336                 'sup' => array(), 
     277                'sup' => array (), 
    337278                'table' => array( 
    338279                        'align' => true, 
    339280                        'bgcolor' => true, 
    340281                        'border' => true, 
    341282                        'cellpadding' => true, 
    342283                        'cellspacing' => true, 
    343                         'class' => true, 
    344284                        'dir' => true, 
    345                         'id' => true, 
    346285                        'rules' => true, 
    347                         'style' => true, 
    348286                        'summary' => true, 
    349287                        'width' => true, 
    350288                ), 
     
    361299                        'bgcolor' => true, 
    362300                        'char' => true, 
    363301                        'charoff' => true, 
    364                         'class' => true, 
    365302                        'colspan' => true, 
    366303                        'dir' => true, 
    367304                        'headers' => true, 
     
    369306                        'nowrap' => true, 
    370307                        'rowspan' => true, 
    371308                        'scope' => true, 
    372                         'style' => true, 
    373309                        'valign' => true, 
    374310                        'width' => true, 
    375311                ), 
     
    383319                'tfoot' => array( 
    384320                        'align' => true, 
    385321                        'char' => true, 
    386                         'class' => true, 
    387322                        'charoff' => true, 
    388323                        'valign' => true, 
    389324                ), 
     
    394329                        'bgcolor' => true, 
    395330                        'char' => true, 
    396331                        'charoff' => true, 
    397                         'class' => true, 
    398332                        'colspan' => true, 
    399333                        'headers' => true, 
    400334                        'height' => true, 
     
    408342                        'align' => true, 
    409343                        'char' => true, 
    410344                        'charoff' => true, 
    411                         'class' => true, 
    412345                        'valign' => true, 
    413346                ), 
    414347                'title' => array(), 
     
    417350                        'bgcolor' => true, 
    418351                        'char' => true, 
    419352                        'charoff' => true, 
    420                         'class' => true, 
    421                         'style' => true, 
    422353                        'valign' => true, 
    423354                ), 
    424                 'tt' => array(), 
    425                 'u' => array(), 
     355                'tt' => array (), 
     356                'u' => array (), 
    426357                'ul' => array ( 
    427                         'class' => true, 
    428                         'style' => true, 
    429358                        'type' => true, 
    430359                ), 
    431360                'ol' => array ( 
    432                         'class' => true, 
    433361                        'start' => true, 
    434                         'style' => true, 
    435362                        'type' => true, 
    436363                ), 
    437364                'var' => array(), 
     
    526453                'sdot',    'lceil',  'rceil',   'lfloor', 'rfloor', 'lang', 
    527454                'rang',    'loz',    'spades',  'clubs',  'hearts', 'diams', 
    528455        ); 
     456 
     457        $allowedposttags = array_map( '_wp_add_global_attributes', $allowedposttags ); 
     458} else { 
     459        $allowedtags = wp_kses_array_lc( $allowedtags ); 
     460        $allowedposttags = wp_kses_array_lc( $allowedposttags ); 
    529461} 
    530462 
    531463/** 
     464 * Return a list of allowed tags and attributes for a given context. 
     465 * 
     466 * @since 3.5.0 
     467 * 
     468 * @param string $context The context for which to retrieve tags. Allowed values are 
     469 *  post | strip | data | entities or the name of a field filter such as pre_user_description. 
     470 * @return array List of allowed tags and their allowed attributes. 
     471 */ 
     472function wp_kses_allowed_html( $context = '' ) { 
     473        global $allowedposttags, $allowedtags, $allowedentitynames; 
     474 
     475        if ( is_array( $context ) ) 
     476                return apply_filters( 'wp_kses_allowed_html', $context, 'explicit' ); 
     477 
     478        switch ( $context ) { 
     479                case 'post': 
     480                        return apply_filters( 'wp_kses_allowed_html', $allowedposttags, $context ); 
     481                        break; 
     482                case 'user_description': 
     483                case 'pre_user_description': 
     484                        $tags = $allowedtags; 
     485                        $tags['a']['rel'] = true; 
     486                        return apply_filters( 'wp_kses_allowed_html', $tags, $context ); 
     487                        break; 
     488                case 'strip': 
     489                        return apply_filters( 'wp_kses_allowed_html', array(), $context ); 
     490                        break; 
     491                case 'entities': 
     492                        return apply_filters( 'wp_kses_allowed_html', $allowedentitynames, $context); 
     493                        break; 
     494                case 'data': 
     495                default: 
     496                        return apply_filters( 'wp_kses_allowed_html', $allowedtags, $context ); 
     497        } 
     498} 
     499 
     500function _wp_add_global_attributes( $value ) { 
     501        $global_attributes = array( 
     502                'class' => true, 
     503                'id' => true, 
     504                'style' => true, 
     505                'title' => true, 
     506        ); 
     507 
     508        if ( true === $value ) 
     509                $value = array(); 
     510 
     511        if ( is_array( $value ) ) 
     512                return array_merge( $value, $global_attributes ); 
     513 
     514        return $value; 
     515} 
     516 
     517/** 
    532518 * Filters content and keeps only allowable HTML elements. 
    533519 * 
    534520 * This function makes sure that only the allowed HTML element names, attribute 
     
    554540        $string = wp_kses_no_null($string); 
    555541        $string = wp_kses_js_entities($string); 
    556542        $string = wp_kses_normalize_entities($string); 
    557         $allowed_html_fixed = wp_kses_array_lc($allowed_html); 
    558         $string = wp_kses_hook($string, $allowed_html_fixed, $allowed_protocols); // WP changed the order of these funcs and added args to wp_kses_hook 
    559         return wp_kses_split($string, $allowed_html_fixed, $allowed_protocols); 
     543        $string = wp_kses_hook($string, $allowed_html, $allowed_protocols); // WP changed the order of these funcs and added args to wp_kses_hook 
     544        return wp_kses_split($string, $allowed_html, $allowed_protocols); 
    560545} 
    561546 
    562547/** 
     
    572557 * @param array $allowed_protocols Allowed protocol in links 
    573558 * @return string Filtered content through 'pre_kses' hook 
    574559 */ 
    575 function wp_kses_hook($string, $allowed_html, $allowed_protocols) { 
     560function wp_kses_hook( $string, $allowed_html, $allowed_protocols ) { 
    576561        $string = apply_filters('pre_kses', $string, $allowed_html, $allowed_protocols); 
    577562        return $string; 
    578563} 
     
    600585 * @param array $allowed_protocols Allowed protocols to keep 
    601586 * @return string Content with fixed HTML tags 
    602587 */ 
    603 function wp_kses_split($string, $allowed_html, $allowed_protocols) { 
     588function wp_kses_split( $string, $allowed_html, $allowed_protocols ) { 
    604589        global $pass_allowed_html, $pass_allowed_protocols; 
    605590        $pass_allowed_html = $allowed_html; 
    606591        $pass_allowed_protocols = $allowed_protocols; 
     
    668653        $elem = $matches[2]; 
    669654        $attrlist = $matches[3]; 
    670655 
     656        if ( ! is_array( $allowed_html ) ) 
     657                $allowed_html = wp_kses_allowed_html( $allowed_html ); 
     658 
    671659        if ( ! isset($allowed_html[strtolower($elem)]) ) 
    672660                return ''; 
    673661        # They are using a not allowed HTML element 
     
    699687function wp_kses_attr($element, $attr, $allowed_html, $allowed_protocols) { 
    700688        # Is there a closing XHTML slash at the end of the attributes? 
    701689 
     690        if ( ! is_array( $allowed_html ) ) 
     691                $allowed_html = wp_kses_allowed_html( $allowed_html ); 
     692 
    702693        $xhtml_slash = ''; 
    703694        if (preg_match('%\s*/\s*$%', $attr)) 
    704695                $xhtml_slash = ' /'; 
     
    12861277 * @param string $data Content to filter, expected to be escaped with slashes 
    12871278 * @return string Filtered content 
    12881279 */ 
    1289 function wp_filter_kses($data) { 
    1290         global $allowedtags; 
    1291         return addslashes( wp_kses(stripslashes( $data ), $allowedtags) ); 
     1280function wp_filter_kses( $data ) { 
     1281        return addslashes( wp_kses( stripslashes( $data ), current_filter() ) ); 
    12921282} 
    12931283 
    12941284/** 
     
    13001290 * @param string $data Content to filter, expected to not be escaped 
    13011291 * @return string Filtered content 
    13021292 */ 
    1303 function wp_kses_data($data) { 
    1304         global $allowedtags; 
    1305         return wp_kses( $data , $allowedtags ); 
     1293function wp_kses_data( $data ) { 
     1294        return wp_kses( $data , current_filter() ); 
    13061295} 
    13071296 
    13081297/** 
     
    13121301 * data from forms. 
    13131302 * 
    13141303 * @since 2.0.0 
    1315  * @uses $allowedposttags 
    13161304 * 
    13171305 * @param string $data Post content to filter, expected to be escaped with slashes 
    13181306 * @return string Filtered post content with allowed HTML tags and attributes intact. 
    13191307 */ 
    13201308function wp_filter_post_kses($data) { 
    1321         global $allowedposttags; 
    1322         return addslashes ( wp_kses(stripslashes( $data ), $allowedposttags) ); 
     1309        return addslashes ( wp_kses( stripslashes( $data ), 'post' ) ); 
    13231310} 
    13241311 
    13251312/** 
     
    13291316 * data from forms. 
    13301317 * 
    13311318 * @since 2.9.0 
    1332  * @uses $allowedposttags 
    13331319 * 
    13341320 * @param string $data Post content to filter 
    13351321 * @return string Filtered post content with allowed HTML tags and attributes intact. 
    13361322 */ 
    13371323function wp_kses_post($data) { 
    1338         global $allowedposttags; 
    1339         return wp_kses( $data , $allowedposttags ); 
     1324        return wp_kses( $data , 'post' ); 
    13401325} 
    13411326 
    13421327/** 
     
    13471332 * @param string $data Content to strip all HTML from 
    13481333 * @return string Filtered content without any HTML 
    13491334 */ 
    1350 function wp_filter_nohtml_kses($data) { 
    1351         return addslashes ( wp_kses(stripslashes( $data ), array()) ); 
     1335function wp_filter_nohtml_kses( $data ) { 
     1336        return addslashes ( wp_kses( stripslashes( $data ), 'strip' ) ); 
    13521337} 
    13531338 
    13541339/**