python 中的这个 eval() 安全吗?

Is this eval() in python safe?

考虑这段代码:

from re import sub

input = request.POST['input']
sub_pattern = {'1':"sub('pattern1','txt1',input)",
               '2':"sub('pattern2','txt2',input)",
              }
eval(sub_pattern['1']) 

这段代码中是否存在代码注入? 你能提供这个代码注入的 POC 吗?

由于传递给 eval 的字符串是常量,没有任何替换,因此此代码是安全的。然而,这也是对最佳实践的毫无意义的偏离:根本没有正当理由在这里使用 eval

假设您希望能够执行 re.sub() 以外的操作,一种方法是使用 lambdas:

from re import sub

input = request.POST['input']
sub_pattern = {'1': lambda input: sub('pattern1','txt1',input),
               '2': lambda input: sub('pattern2','txt2',input)}
sub_pattern['1'](input)