максимум Asked:2024-06-17 05:35:51 +0000 UTC2024-06-17 05:35:51 +0000 UTC 2024-06-17 05:35:51 +0000 UTC 为什么使用 eval() 很危险? 772 我正在为计算器编写代码(即,我输入了一个示例并得到了答案)。 我找到了一种使用 eval() 的方法,但他们说这很危险。 为什么它很危险以及什么可以替代它? python 2 个回答 Voted Best Answer Amgarak 2024-06-17T20:04:49Z2024-06-17T20:04:49Z 在计算器的上下文中,我对输入表达式的安全性进行了简单检查: import math import re def safe_eval(string): allowed_chars = set('0123456789+-*/(). aceinopqstr') danger_keys = {'not', 'is', 'in', 'or', 'and', 'assert', 'raise', 'import', 'exec', 'eval', 'Ellipsis', 'as', 'case', 'pass'} if set(string) - allowed_chars: raise ValueError("Выражение содержит недопустимые символы") for keyword in danger_keys: if re.search(r'\b' + re.escape(keyword) + r'\b', string): raise ValueError("Выражение содержит недопустимые ключевые слова") return eval(string, {'__builtins__': {'sin': math.sin, 'cos': math.cos, 'tan': math.tan, 'sqrt': math.sqrt, 'pi': math.pi, 'e': math.e}}) safe = "sqrt(tan(54) - cos((2.8 + 3) * sin(pi / 4) + 10.5e-3))" try: result = safe_eval(safe) print(f"Результат: {result}") except Exception as e: print(f"Ошибка: {e}") danger = "__import__('os').shutdown()" try: result = safe_eval(danger) print(f"Результат: {type(result)}") except Exception as e: print(f"Ошибка: {e}") Justiks 2024-06-17T08:24:08Z2024-06-17T08:24:08Z Python文档: eval(expression, globals=None, locals=None) Параметры: expression (str | code object) – Python выражение (Проще Python код) ... Аргумент expression анализируется и оценивается как Python выражение (Проще Python код) ... 也就是说,eval它确实允许你做任何你扔给它的事情。想象一下计算器的用户在输入字段中书写os.shutdown()。你的代码: expression = input() eval(exspression) Expression将被执行,计算机将关闭,并且您将没有专用用户。 这听起来确实像个笑话。在计算器中,您可以eval毫无愧疚地使用它,因为您对输入负责。但在实际项目中eval应谨慎使用。 如果需要,eval您可以用一个简单的函数替换它,例如: def main(): expression = input() first_number = "" index = 0 while expression[index].isdigit(): first_number += expression[index] index += 1 operator = expression[index] second_number = expression[index+1:] if operator == "+": print(int(first_number) + int(second_number)) elif operator == "-": print(int(first_number) - int(second_number)) elif operator == "*": print(int(first_number) * int(second_number)) elif operator == "/": print(int(first_number) / int(second_number))
在计算器的上下文中,我对输入表达式的安全性进行了简单检查:
Python文档:
也就是说,
eval它确实允许你做任何你扔给它的事情。想象一下计算器的用户在输入字段中书写os.shutdown()。你的代码:Expression将被执行,计算机将关闭,并且您将没有专用用户。这听起来确实像个笑话。在计算器中,您可以
eval毫无愧疚地使用它,因为您对输入负责。但在实际项目中eval应谨慎使用。如果需要,
eval您可以用一个简单的函数替换它,例如: