[wp-trac] [WordPress Trac] #37698: wp_kses_split global variable pollution
WordPress Trac
noreply at wordpress.org
Wed Aug 17 20:20:16 UTC 2016
#37698: wp_kses_split global variable pollution
--------------------------+-----------------------------
Reporter: xknown | Owner:
Type: defect (bug) | Status: new
Priority: normal | Milestone: Awaiting Review
Component: General | Version:
Severity: normal | Keywords:
Focuses: |
--------------------------+-----------------------------
In r10339, `wp_kses_split` was modified so it doesn't longer require the
`preg_replace` with the `e` (eval) modifier. This implementation uses
globals to pass the values of `$allowed_html` and `$allowed_protocols` to
the `_wp_kses_split_callback` function.
While in most cases this isn't really a problem, we noticed that a call to
`wp_kses_split` (via a filter) from within `_wp_kses_split_callback` may
have undesirable effects on the next replacements.
The snippet below illustrates this problem, you can see in action in
https://3v4l.org/YmYTZ
{{{
<?php
function wp_kses_split( $string, $allowed_html, $allowed_protocols ) {
global $pass_allowed_html, $pass_allowed_protocols;
$pass_allowed_html = $allowed_html;
$pass_allowed_protocols = $allowed_protocols;
return preg_replace_callback( '%((<!--.*?(-->|$))|(<[^>]*(>|$)|>))%',
'_wp_kses_split_callback', $string );
}
function _wp_kses_split_callback( $match ) {
global $pass_allowed_html, $pass_allowed_protocols;
return wp_kses_split2( $match[1], $pass_allowed_html,
$pass_allowed_protocols );
}
function wp_kses_split2($string, $allowed_html, $allowed_protocols) {
wp_kses_split('', array(), array()); // this overrides the globals.
print_r( array( $allowed_html, $allowed_protocols ) );
}
wp_kses_split("<a style='color: red;'>I link this</a>", array('a'=>array(
'style' => array() )), array('http') );
}}}
One way to fix this would be to use an anonymous function, but I guess
that's only available on PHP >= 5.3. Another way is to encapsulate the
callback in a class and tie the arguments to an instance of this class.
--
Ticket URL: <https://core.trac.wordpress.org/ticket/37698>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform
More information about the wp-trac
mailing list