gpt4 book ai didi

php - 多字节字符串上的 str_replace() 危险吗?

转载 作者:IT王子 更新时间:2023-10-28 23:50:03 26 4
gpt4 key购买 nike

鉴于某些多字节字符集,我是否正确假设以下内容没有达到预期的效果?

$string = str_replace('"', '\\"', $string);

特别是,如果输入的字符集中可能包含像 0xbf5c 这样的有效字符,那么攻击者可以注入(inject) 0xbf22 来获取 0xbf5c22,留下一个有效字符后跟一个不带引号的双引号 (")。

有没有一种简单的方法可以缓解这个问题,还是我一开始就误解了这个问题?

(在我的例子中,字符串进入 HTML 输入标签的 value 属性: echo 'input type="text"value="' . $string . '">';)

编辑:就此而言,像 preg_quote() 这样的函数呢?它没有字符集参数,因此在这种情况下它似乎完全没用。当您没有将字符集限制为 UTF-8 的选项时(是的,那很好),您似乎真的有缺陷。在这种情况下可以使用哪些替换和引用功能?

最佳答案

不,你是对的:在多字节字符串上使用单字节字符串函数可能会导致意外结果。使用 multibyte string functions相反,例如 mb_ereg_replacemb_split :

$string = mb_ereg_replace('"', '\\"', $string);
$string = implode('\\"', mb_split('"', $string));

编辑 这是一个使用拆分连接变体的 mb_replace 实现:

function mb_replace($search, $replace, $subject, &$count=0) {
if (!is_array($search) && is_array($replace)) {
return false;
}
if (is_array($subject)) {
// call mb_replace for each single string in $subject
foreach ($subject as &$string) {
$string = &mb_replace($search, $replace, $string, $c);
$count += $c;
}
} elseif (is_array($search)) {
if (!is_array($replace)) {
foreach ($search as &$string) {
$subject = mb_replace($string, $replace, $subject, $c);
$count += $c;
}
} else {
$n = max(count($search), count($replace));
while ($n--) {
$subject = mb_replace(current($search), current($replace), $subject, $c);
$count += $c;
next($search);
next($replace);
}
}
} else {
$parts = mb_split(preg_quote($search), $subject);
$count = count($parts)-1;
$subject = implode($replace, $parts);
}
return $subject;
}

关于参数的组合,这个函数应该表现得像单字节str_replace

关于php - 多字节字符串上的 str_replace() 危险吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3786003/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com