WordPress.org

Make WordPress Core

Ticket #20210: 20210.4.diff

File 20210.4.diff, 13.1 KB (added by ryan, 6 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/**