WordPress.org

Make WordPress Core

Changeset 48132


Ignore:
Timestamp:
06/23/2020 05:05:57 AM (3 months ago)
Author:
whyisjake
Message:

Formatting: Extend wp_kses_hair and wp_kses_hair_parse to allow digits and underscores.

Fixes a lot of issues around parsing XML/HTML attributes.

Fixes #49464.

See #34406, #48608.

Props codeforest, zodiac1978, johnpgreen, dlh, ayeshrajans, johnpgreen, rilwis, travisnorthcutt, miqrogroove, chriscct7, whyisjake.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/kses.php

    r48121 r48132  
    12621262        switch ( $mode ) {
    12631263            case 0:
    1264                 if ( preg_match( '/^([-a-zA-Z:]+)/', $attr, $match ) ) {
     1264                if ( preg_match( '/^([_a-zA-Z][-_a-zA-Z0-9:.]*)/', $attr, $match ) ) {
    12651265                    $attrname = $match[1];
    12661266                    $working  = 1;
    12671267                    $mode     = 1;
    1268                     $attr     = preg_replace( '/^[-a-zA-Z:]+/', '', $attr );
     1268                    $attr     = preg_replace( '/^[_a-zA-Z][-_a-zA-Z0-9:.]*/', '', $attr );
    12691269                }
    12701270
     
    14521452    // phpcs:disable Squiz.Strings.ConcatenationSpacing.PaddingFound -- don't remove regex indentation
    14531453    $regex =
    1454     '(?:'
    1455     .     '[-a-zA-Z:]+'   // Attribute name.
    1456     . '|'
    1457     .     '\[\[?[^\[\]]+\]\]?' // Shortcode in the name position implies unfiltered_html.
    1458     . ')'
    1459     . '(?:'               // Attribute value.
    1460     .     '\s*=\s*'       // All values begin with '='.
    1461     .     '(?:'
    1462     .         '"[^"]*"'   // Double-quoted.
    1463     .     '|'
    1464     .         "'[^']*'"   // Single-quoted.
    1465     .     '|'
    1466     .         '[^\s"\']+' // Non-quoted.
    1467     .         '(?:\s|$)'  // Must have a space.
    1468     .     ')'
    1469     . '|'
    1470     .     '(?:\s|$)'      // If attribute has no value, space is required.
    1471     . ')'
    1472     . '\s*';              // Trailing space is optional except as mentioned above.
     1454        '(?:'
     1455        .     '[_a-zA-Z][-_a-zA-Z0-9:.]*'   // Attribute name.
     1456        . '|'
     1457        .     '\[\[?[^\[\]]+\]\]?' // Shortcode in the name position implies unfiltered_html.
     1458        . ')'
     1459        . '(?:'               // Attribute value.
     1460        .     '\s*=\s*'       // All values begin with '='.
     1461        .     '(?:'
     1462        .         '"[^"]*"'   // Double-quoted.
     1463        .     '|'
     1464        .         "'[^']*'"   // Single-quoted.
     1465        .     '|'
     1466        .         '[^\s"\']+' // Non-quoted.
     1467        .         '(?:\s|$)'  // Must have a space.
     1468        .     ')'
     1469        . '|'
     1470        .     '(?:\s|$)'      // If attribute has no value, space is required.
     1471        . ')'
     1472        . '\s*';              // Trailing space is optional except as mentioned above.
    14731473    // phpcs:enable
    14741474
  • trunk/tests/phpunit/tests/kses.php

    r48086 r48132  
    630630                false,
    631631            ),
     632            // using digit in attribute name should work
     633            array(
     634                'href="https://example.com/[shortcode attr=\'value\']" data-op3-timer-seconds="0"',
     635                array( 'href="https://example.com/[shortcode attr=\'value\']" ', 'data-op3-timer-seconds="0"' ),
     636            ),
     637            // using underscore in attribute name should work
     638            array(
     639                'href="https://example.com/[shortcode attr=\'value\']" data-op_timer-seconds="0"',
     640                array( 'href="https://example.com/[shortcode attr=\'value\']" ', 'data-op_timer-seconds="0"' ),
     641            ),
     642            // using period in attribute name should work
     643            array(
     644                'href="https://example.com/[shortcode attr=\'value\']" data-op.timer-seconds="0"',
     645                array( 'href="https://example.com/[shortcode attr=\'value\']" ', 'data-op.timer-seconds="0"' ),
     646            ),
     647            // using digit at a beginning of attribute name should return false
     648            array(
     649                'href="https://example.com/[shortcode attr=\'value\']" 3data-op-timer-seconds="0"',
     650                false,
     651            ),
    632652        );
    633653    }
Note: See TracChangeset for help on using the changeset viewer.