gpt4 book ai didi

regex - 如何在 Perl 中安全地验证不受信任的正则表达式?

转载 作者:行者123 更新时间:2023-12-04 23:02:17 25 4
gpt4 key购买 nike

This answer解释说要验证任意正则表达式,只需使用 eval :

while (<>) {
eval "qr/$_/;"
print $@ ? "Not a valid regex: $@\n" : "That regex looks valid\n";
}

然而,这让我觉得非常不安全,我希望这是显而易见的原因。有人可以输入,说:

foo/; system('rm -rf /'); qr/



或者他们可以设计的任何狡猾的计划。

防止这种事情的自然方法是转义特殊字符,但如果我转义太多字符,我首先会严重限制正则表达式的有用性。我相信,可以提出一个强有力的论据,至少 []{}()/-,.*?^$!在用户正则表达式界面中,应该允许(可能还有其他字符)未转义的空白字符,以使正则表达式的用处最小。

是否有可能在不限制正则表达式语言的有用性的情况下保护自己免受正则表达式注入(inject)?

最佳答案

解决方法就是改变

eval("qr/$_/")
eval("qr/\$_/")
这可以写得更清楚如下:
eval('qr/$_/')
但这仍然不是最优的。以下会好得多,因为它不涉及在运行时生成和编译 Perl 代码:
eval { qr/$_/ }
请注意,这两种解决方案都不能保护您免受拒绝服务攻击。编写一个需要比宇宙生命周期更长的时间才能完成的模式是很容易的。为了解决这种情况,您可以在 CPU ulimit 的子节点中执行正则表达式匹配。已经设置好了。

关于regex - 如何在 Perl 中安全地验证不受信任的正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20357755/

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