Python 正则表达式包括负回溯
我试图在通过python中的Python 正则表达式包括负回溯,python,regex,Python,Regex,我试图在通过python中的eval之前过滤字符串。我想把它限制在数学函数上,但我不知道如何用正则表达式去掉它。考虑以下事项: s = 'math.pi * 8' print eval(raw_input(), {"__builtins__":None}, {'pi':math.pi}) 我想把它基本上翻译成‘math.pi*8’,去掉空格。我还想去掉后面没有跟着math\.的字母[A-Za-z] 因此,如果s='而(1):打印“hello”,我希望剥离其中的任何可执行部分: 理想情况下,s
eval
之前过滤字符串。我想把它限制在数学函数上,但我不知道如何用正则表达式去掉它。考虑以下事项:
s = 'math.pi * 8'
print eval(raw_input(), {"__builtins__":None}, {'pi':math.pi})
我想把它基本上翻译成‘math.pi*8’,去掉空格。我还想去掉后面没有跟着math\.
的字母[A-Za-z]
因此,如果s='而(1):打印“hello”
,我希望剥离其中的任何可执行部分:
理想情况下,s等于该场景中的():“
(所有字母都消失了,因为它们后面没有math\。
)
这是我试过的正则表达式:
(?<!math\.)[A-Za-z\s]+
正如@Carl在评论中所说的,看看什么能让事情变得更好。但即使这样也不够 链接中描述的技术如下:
s = 'math.pi * 8'
print eval(raw_input(), {"__builtins__":None}, {'pi':math.pi})
但这并不能阻止类似的事情
([x for x in 1.0.__class__.__base__.__subclasses__()
if x.__name__ == 'catch_warnings'][0]()
)._module.__builtins__['__import__']('os').system('echo hi!')
资料来源:Ned Batcheld关于沙箱的几篇文章,见
编辑:指出我们没有方括号或空格,因此:
1.0.__class__.__base__.__subclasses__().__getitem__(i)()._module.__builtins__.get('__import__')('os').system('echo hi')
如果您只是尝试了大量的i值。此练习的目的是什么?如果您的真正目的是接受用户输入,然后使用
eval
进行评估,那么这不是一种非常安全的方法。提供了一种更安全的方法,并给出了很好的解释。这正是我所寻找的@carltheraw\u input()首先转换为字符串,去掉方括号和空格,所以我认为我或多或少是安全的。想法?此外,我只是尝试将上面的脚本传递到一个eval中,就像lybniz建议的那样,但它没有执行(如我所希望的那样)。给出了一个AttributeError:“dict”对象没有属性“import”。@bozdoz修复了,我忘记了\uuuu builtins\uuuuu
是一个以某种方式重新格式化的dict。是的,它被触发了,即使在eval中设置了globals。不管怎样,我们传递的字符串带方括号,所以列表理解和dict键都不起作用。@bozdoz固定括号和空格