gpt4 book ai didi

python - 将用户输入用于 Python 的正则表达式是否安全?

转载 作者:IT老高 更新时间:2023-10-28 21:18:10 24 4
gpt4 key购买 nike

我想让我的用户对某些功能使用正则表达式。我很好奇将用户输入传递给 re.compile() 的含义是什么。我假设用户没有办法给我一个可以让他们执行任意代码的字符串。我想到的危险是:

  1. 用户可以传递引发异常的输入。
    • 用户可能会传递导致正则表达式引擎花费很长时间或占用大量内存的输入。

1. 的解决方案很简单:捕获异常。我不确定 2 是否有一个好的解决方案。也许只是限制正则表达式的长度就可以了。

我还有什么需要担心的吗?

最佳答案

我开发了一个程序,允许用户输入他们自己的正则表达式,你是对的 - 他们可以(并且确实)输入可能需要很长时间才能完成的正则表达式 - 有时比宇宙的生命周期还要长。更糟糕的是,在处理正则表达式时,Python 持有 GIL,因此它不仅会挂起正在运行正则表达式的线程,还会挂起整个程序。

限制正则表达式的长度不起作用,因为问题在于回溯。例如,在不包含“x”的长度为 N 的字符串上匹配正则表达式 r"(\S+)+x" 将回溯 2**N 次。在我的系统上,这需要大约一秒钟来匹配 "a"*21 并且每个附加字符的时间加倍,因此 100 个字符的字符串大约需要 19167393131891000 年才能完成(这是一个估计值,我没有计时)。

有关更多信息,请阅读 O'Reilly 的“掌握正则表达式”一书 - 其中有几章是关于性能的。

编辑为了解决这个问题,我们编写了一个正则表达式分析函数,试图捕捉和拒绝一些更明显的退化情况,但不可能得到所有这些情况。

我们看到的另一件事是修补 re 模块以在它回溯太多次时引发异常。这是可能的,但需要更改 Python C 源代码并重新编译,因此不可移植。我们还提交了一个补丁来在匹配 python 字符串时释放 GIL,但我认为它没有被核心接受(python 只保存 GIL,因为正则表达式可以针对可变缓冲区运行)。

关于python - 将用户输入用于 Python 的正则表达式是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1998104/

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