gpt4 book ai didi

PHP - 这是允许用户提供正则表达式的安全方法吗

转载 作者:行者123 更新时间:2023-12-03 00:11:35 25 4
gpt4 key购买 nike

我希望允许提交小型用户定义的正则表达式进行测试。然而,从失控的服务器使用到更邪恶的 eval() 使用,还有许多问题需要考虑。

据我所知,我已经在下面的代码中解决了我能想到的所有问题。他们有我没有想到的攻击媒介吗? (我知道这是一个相当幼稚的问题)

function testRegex($regex)
{
// null character allows a premature regex end and "/../e" injection
if (strpos($regex, 0) !== false || ! trim($regex)) {
return false;
}

$backtrack_limit = ini_set('pcre.backtrack_limit', 200);
$recursion_limit = ini_set('pcre.recursion_limit', 20);

$valid = @preg_match("~$regex~u", null) !== false;

ini_set('pcre.backtrack_limit', $backtrack_limit);
ini_set('pcre.recursion_limit', $recursion_limit);

return $valid;
}


$regexes = array(
"InvalidRegular)Expression",
'',
'\w+',
'\/\w+/',
'foo[bar]*',
'\/\x00known/e' . chr(0x00) . chr(0),
'known~e' . chr(0),
'known~e' . chr(0x00),
'[a-z]+',
'\p{Lu}+',
);


foreach($regexes as $regex) {
var_dump($regex, testRegex($regex));
}

如果您想查看空字节注入(inject)的示例:

$user_regex = '.+~e' . chr(0);
$user_match = 'system("whoami")';

var_dump(preg_replace("~$user_regex~u", $user_match, 'foo'));

最佳答案

显然,测试字符串是否是有效正则表达式的唯一方法是对其进行编译(在调用任何匹配函数时完成),因此您所做的事情很有意义。

自 5.4 起,您添加的空字节保护实际上是不必要的,因为 the leader 中已经进行了检查。 , the middlethe ending 。后者尤其是相对较新的 commit (2011) 修复this bug .

设置较低的回溯和递归限制是一个足够好的沙箱,也许您也可以检查最大长度。

也就是说,这个特定的解决方案不提供使用 /s/i/m 等修饰符的功能;也许这不是您目前主要关心的问题,而是值得深思的:)

关于PHP - 这是允许用户提供正则表达式的安全方法吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21842773/

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