加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 23:22:24 所属栏目:大数据 来源:网络整理
导读:This answer解释了要验证任意正则表达式,只需使用eval: while () { eval "qr/$_/;" print $@ ? "Not a valid regex: $@n" : "That regex looks validn";} 然而,这让我感到非常不安全,因为我希望这是显而易见的原因.有人可以输入,说: foo/; system(‘rm -
This answer解释了要验证任意正则表达式,只需使用eval:

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

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

foo/; system(‘rm -rf /’); qr/

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

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

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

解决方法

解决方案只是改变

eval("qr/$_/")

eval("qr/$_/")

这可以写得更清楚如下:

eval('qr/$_/')

但那仍然不是最佳的.以下内容会更好,因为它不涉及在运行时生成和编译Perl代码:

eval { qr/$_/ }

请注意,这两种解决方案都不能保护您免受拒绝服务攻击.编写一个比宇宙生命需要更长时间才能完成的模式非常容易.为了解决这种情况,您可以在已设置CPU ulimit的子级中执行正则表达式匹配.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读