我正在替换我的cms中的一些代码以准备php升级。
这是我要替换的代码:
$REQUEST_URI = preg_replace('#([\x3C\x3E])#e', '"%".bin2hex(\'\\1\')', $_SERVER['REQUEST_URI']);
这是我的替代品:
$REQUEST_URI = my_unicode_conv($_SERVER['REQUEST_URI']);
function my_unicode_conv($word) {
return preg_replace_callback('/([\x3C\x3E])/',create_function ('$matches','return bin2hex($matches[1]);'), $word);
}
这些是等价的吗?我该如何测试这段代码?
答案 0 :(得分:1)
通常不需要使用eval。让我们来看看这段代码到底做了什么。
首先\x
表示UTF8字符特定为十六进制。对于任何数字< 7F
这只是ASCII。因此,我们可以在ASCII table中轻松查找这些字符。
\x3C
=“<”\x3E
=“>” bin2hex
函数将为这些字符提供十六进制表示(“3C”和“3E”)。
此外,eval在十六进制表示前添加“%”。
简而言之,任何“<”在REQUEST_URI中替换为“%3C”和“>”替换为“%3E”。
我们可以简单地执行str_replace
$REQUEST_URI = str_replace(['<', '>'], ['%3C', '%3E'], $_SERVER['REQUEST_URI']);