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