ID:               48180
 Updated by:       j...@php.net
 Reported By:      5up3rh3i at gmail dot com
-Status:           Verified
+Status:           Wont fix
 Bug Type:         mbstring related
 Operating System: *
 PHP Version:      5.*CVS, 6CVS (2009-05-08)
 New Comment:

Considered and realized that we can't really fix this. You just have to

do the 'addslashes()' yourself. Reason: doing "magical" addslashes() 
call on the replacement would cause problems with certain encodings.


Previous Comments:
------------------------------------------------------------------------

[2009-05-09 05:13:07] j...@php.net

This should show the problem more clearly:

<?php

function test() {echo "THIS SHOULD NOT BE SEEN!!\n";}
function ryat($a) {var_dump($a);}

$str = "', test(), '";

echo "mb_ereg_replace()\n";
var_dump(mb_ereg_replace('^(.*)$', "ryat('\\1')", $str, 'e'));

echo "\npreg_replace()\n";
var_dump(preg_replace('/^(.*)$/e', "ryat('\\1')", $str));

?>


------------------------------------------------------------------------

[2009-05-07 14:54:22] 5up3rh3i at gmail dot com

Description:
------------
when option parameter set e, matches not be escaped.

ex:

<?php

function 80vul() {}

$str = '\', phpinfo(), \'';
mb_ereg_replace('^(.*)$', '80vul(\'\1\')', $str, 'e');

?>

phpinfo() will be evaluated.

mb_ereg_replace()

                                if ((replace_len - i) >= 2 && fwd == 1 &&
                                        p[0] == '\\' && p[1] >= '0' && p[1] <= 
'9') {
                                        n = p[1] - '0';
                                }
                                if (n >= 0 && n < regs->num_regs) {
                                        if (regs->beg[n] >= 0 && regs->beg[n] < 
regs->end[n] &&
regs->end[n] <= string_len) {
                                                smart_str_appendl(pbuf, string 
+ regs->beg[n], regs->end[n] -
regs->beg[n]);
// matches not be escaped
                                        }
                                        
preg_replace()

                if ('\\' == *walk || '$' == *walk) {
                        smart_str_appendl(&code, segment, walk - segment);
                        if (walk_last == '\\') {
                                code.c[code.len-1] = *walk++;
                                segment = walk;
                                walk_last = 0;
                                continue;
                        }
                        segment = walk;
                        if (preg_get_backref(&walk, &backref)) {
                                if (backref < count) {
                                        /* Find the corresponding string match 
and substitute it
                                           in instead of the backref */
                                        match = subject + offsets[backref<<1];
                                        match_len = offsets[(backref<<1)+1] - 
offsets[backref<<1];
                                        if (match_len) {
                                                esc_match = 
php_addslashes_ex(match, match_len, &esc_match_len,
0, 1 TSRMLS_CC);
// matches escaped by addslashes()
...
                                smart_str_appendl(&code, esc_match, 
esc_match_len);



------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=48180&edit=1

Reply via email to