RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1584158
Accepted
максимум
максимум
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 2 个回答
  • 167 Views

2 个回答

  • Voted
  1. 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}")
    
    • 1
  2. 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))
    
    • 0

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5