2015-06-01 49 views
-2

考慮下面的代碼:這是eval()在Python中安全嗎?

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嗎?

+1

爲什麼你甚至不屑?你不需要在這裏**'eval'來完成你正在做的事情。 –

+1

你爲什麼要這麼做?爲什麼不使用'sub(arg1,arg2,input)'並從映射中選擇'arg1'和'arg2'? –

+0

'sub_pattern = {'1':lambda i:sub('pattern1','txt1',i),...}' –

回答

6

由於傳遞給eval的字符串是不變的,沒有任何替代,所以這段代碼是安全的。然而,這也是對最佳實踐的毫無意義的偏差:根本沒有合法理由在此使用eval

假設你希望能夠做的比re.sub()其他操作,一個方法是使用lambda表達式:

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) 
+2

根據你對函數式編程的看法,'functools.partial()'可能更易於閱讀。 – Kevin