PHP-这是允许用户提供正则表达式的安全方法吗
我希望允许提交小型用户定义的正则表达式进行测试。但是,从运行服务器使用到更坏的代码>代码>(< /代码>用法),还有很多问题需要考虑。 据我所知,我已经处理了我在下面代码中能想到的所有问题。他们有我没想到的攻击载体吗?(我知道这是一个相当天真的问题) 如果您想查看PHP-这是允许用户提供正则表达式的安全方法吗,php,regex,user-input,sanitization,remote-execution,Php,Regex,User Input,Sanitization,Remote Execution,我希望允许提交小型用户定义的正则表达式进行测试。但是,从运行服务器使用到更坏的代码>代码>(< /代码>用法),还有很多问题需要考虑。 据我所知,我已经处理了我在下面代码中能想到的所有问题。他们有我没想到的攻击载体吗?(我知道这是一个相当天真的问题) 如果您想查看空字节注入的示例: $user_regex = '.+~e' . chr(0); $user_match = 'system("whoami")'; var_dump(preg_replace("~$user_regex~u", $u
空字节
注入的示例:
$user_regex = '.+~e' . chr(0);
$user_match = 'system("whoami")';
var_dump(preg_replace("~$user_regex~u", $user_match, 'foo'));
显然,测试字符串是否为有效正则表达式的唯一方法是编译它(这是在调用任何匹配函数时完成的),因此您所做的非常有意义 从5.4开始,您添加的空字节保护实际上是不必要的,因为已经在和中进行了检查。特别是后者是一个相对较新(2011年)的问题 设置一个较低的回溯和递归限制是一个足够好的沙盒,也许您还可以检查最大长度
也就是说,这个特定的解决方案不提供使用修饰符的能力,例如
/s
、/i
和/m
;也许这不是您目前主要关心的问题,而是值得思考的:)您可以告诉他们输入类似{expression}的内容,然后使用preg_replace()。这样,他们只使用你允许他们使用的东西。如果(strpos($regex,0)!==false&&trim($regex)){return false;}
在顶部会更容易理解:)谢谢,我更新了它。另外,请注意chr(0)!=0
Ah,检查文档,您将看到的第二个参数可以是整数值:)只是一个旁注:您可能希望将分隔符和正则表达式修饰符存储在单独的变量中。这样“用户”就可以定义自己的修饰符,并在提供正则表达式时考虑到这一点。当然,你可以限制选择。修改器也是如此。我会想象像$delimiter这样的东西$正则表达式$定界符$修饰符
。请注意,如果您使用括号作为分隔符(f.ex.“($regex)u”
),您的用户不必猜测应该另外转义哪个分隔符。空字节保护实际上是必要的。PHP只检查结尾分隔符前的空字节。@谢谢,我已经相应地更新了答案;我们都是对的:)
$user_regex = '.+~e' . chr(0);
$user_match = 'system("whoami")';
var_dump(preg_replace("~$user_regex~u", $user_match, 'foo'));