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

mHx*_*ave -2 python eval code-injection

考虑这段代码:

from re import sub

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

这段代码中是否有代码注入?你可以为这段代码注入提供POC吗?

Cha*_*ffy 6

由于传递给的字符串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)
Run Code Online (Sandbox Code Playgroud)

  • 根据您对函数式编程的看法,`functools.partial()`可能更容易阅读. (2认同)