2016-11-30 3 views
0

Ну, почти все там говорят, что eval злой, и это верно для 99% ситуаций ... НО Я здесь, чтобы спросить о некотором фрагменте кода, который я написал, который использует eval, SO, Is this опасно?EVAL(). Это опасно?

Я попытался дезинфицировать данные, как наиболее насколько это возможно, сохраняя при этом оригинальный Funtionality, но это делает использование eval и что-то может пойти не так:

import os 

try: 
    if os.environ["LANG"].rstrip('''\n''')[5:] == ".UTF-8": 
     Language = str(os.environ["LANG"].rstrip('''\n''').rstrip(os.environ["LANG"].rstrip('''\n''')[5:])) 
     eval (str("LP." + Language + "()")) 
    else: 
     raise Exception("Not an UTF-8 locale") 
except KeyError: 
    LP.Fallback() 
except AttributeError: 
    LP.Fallback() 

Прежде всего, этот код должен работать под UNIX и производные.

Написал в python2.7.

Что это значит, это вызвать некоторые методы внутри класса LP.

Я пытался настройки уже испортить мой компьютер пытается изменить переменную LANG системы на любую строку, которая может нанести вред моему компьютеру, как rm -rf / или подобия, но, потому что мой код удаляет последние 5 символов из LANG вара & добавляет LP. в начале и () в конце, это приводит к этому, не говоря уже о том, что он проверяет с начала, если последние 5 символов строки: UTF-8, но если я удалю это условие, это должна быть «вредная» команда:

LP.rm -r()

До сих пор я отмечаю d, что любая команда длиной более 5 символов не сможет обойти строку кода «удалить последние 5 символов», и добавление LP. & () должно быть достаточным для нейтрализации любой попытки причинить вред.

До сих пор, я буду держать».utf-8" , чтобы избежать критической ошибки ...

ответ

3

я не вижу никаких причин для eval здесь вообще.

Вы пытаетесь получить метод на LP, который соответствует настройке LANGUAGE. Таким образом, вы можете использовать getattr:

meth = getattr(LP, Language) 
result = meth() 

Примечания нет необходимости, чтобы сделать rstrip запихнуть так много раз:

lang = os.environ["LANG"].rstrip('''\n''') 
if lang.endswith(".UTF-8"): 
    ... 
+0

Это работало как положено. Не знал о 'endswitch' &' getattr', с ними все работает. Такой быстрый ответ, спасибо! P.S: Является ли 'eval' 100% заменяемым какой-либо другой командой? Или есть иногда, когда это единственное решение? – PythonNoob

+1

Я уверен, что бывают случаи, когда это единственное решение, иначе оно вообще не будет на языке. Однако они должны быть довольно редкими. –

+0

Хорошо, спасибо за всю эту информацию. – PythonNoob

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