Код Smell 245 — Exec() и Eval()
5 апреля 2024 г.Отличная дверь для хакеров
<блок-цитата>TL;DR: Не используйте метапрограммирование. Это не так уж и круто
Проблемы
- Безопасность
- Ограниченный контроль
Решения
- Используйте прямые звонки
- Оберните выполнение в примитивную и контролируемую команду
- Обеззараживать ол>
- Автоматически
- Метапрограммирование
- Средний
Контекст
Разработчики используют функции eval() и exec() для вычисления произвольных выражений из строк.
Они могут быть мощным инструментом в определенных контекстах, но сопряжены с рядом рисков и проблем, особенно когда используются с ненадежными входными данными или когда поведение кода не полностью контролируется или не понимается.
Пример кода
Неверно
def calculate(mathOperand, firstArgument, secondArgument):
return eval(f'{firstArgument} {mathOperand} {secondArgument}')
# Sample usage to multiply two numbers
result = calculate('*', 4, 6)
# Injection to remove all files
calculate('', "__import__('os').system('rm -rf *')",''))
Верно
def calculate(mathOperand, firstArgument, secondArgument):
if mathOperand == '+':
return firstArgument + secondArgument
elif mathOperand == '-':
return firstArgument - secondArgument
elif mathOperand == '*':
return firstArgument * secondArgument
elif mathOperand == '/':
if secondArgument != 0:
return firstArgument / secondArgument
else:
return "Error: Division by zero"
else:
return "Error: Invalid operation - Do not hack!"
# This is a quick solution but another smell
# You should avoid this kind of switches and iterate to
# a Polymorphic Hierarchy
Обнаружение
Вы можете выполнить поиск eval() в коде
Теги
Уровень
ИИ-помощники
Большинство ИИ-помощников избегают использования eval() в своих решениях.
Они также распознают это как запах кода и предлагают разные варианты.
Заключение
Избегайте этого метапрограммного решения, жестко запрограммировав все возможные сценарии и избегая чрезмерных обобщений.
Отношения
Code Smell 207 – динамические методы< /п>
Код Smell 189 – не очищенный ввод
Code Smell 215 – десериализация уязвимости объекта
Дополнительная информация
https://hackernoon.com/laziness-chapter-i-meta-programming -6s4l300e?embedable=true
Отказ от ответственности
Запахи кода — это мои мнение.
Кредиты
Фото Яна на Отменить заставку
<блок-цитата>
Когда вы на самом деле садитесь писать код, вы узнаете вещи, которые вы не получили, размышляя о них в терминах моделирования… там есть процесс обратной связи, который вы действительно можете получить, только выполнив некоторые вещи и увидев, что работает.
Мартин Фаулер
https://hackernoon.com/400- Thought-provoking-software-engineering -quotes?embedable=true
Эта статья входит в серию CodeSmell.
https://hackernoon .com/how-to-find-the-stinky-parts-of-your-code-part-i-xqz3evd?embedable=true
Оригинал