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

 不要破网名_329 发布于 2023-02-13 10:20

这个答案解释了要验证任意正则表达式,只需使用eval:

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

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

富/; system('rm -rf /'); QR /

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

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

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

1 个回答
  • 解决方案只是改变

    eval("qr/$_/")
    

    eval("qr/\$_/")
    

    这可以写得更清楚如下:

    eval('qr/$_/')
    

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

    eval { qr/$_/ }
    

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

    2023-02-13 10:24 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有