2015-06-01 2 views
-2

рассмотреть этот код:Является ли этот eval() безопасным для питона?

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() операций, один подход заключается в использовании лямбды:

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

Смежные вопросы