Python eval安全隐患

代码注入等威胁

1、锁屏

python 复制代码
import os
print(os.system('rundll32.exe user32.dll,LockWorkStation'))

2、eval注入风险

python 复制代码
import ast
import re
import platform

def get_lock_command():
    """根据当前操作系统返回对应的锁屏命令"""
    os_type = platform.system()
    if os_type == "Windows":
        # Windows 锁屏命令
        return "rundll32.exe user32.dll,LockWorkStation"
    elif os_type == "Linux":
        # Linux GNOME桌面环境锁屏命令
        return "gnome-screensaver-command -l"
    elif os_type == "Darwin":
        # macOS 锁屏命令
        return "pmset displaysleepnow"
    else:
        return "echo 不支持的操作系统"

def test_safe_eval():
    print("=" * 50)
    print("1. 危险操作:使用 eval()")
    print("=" * 50)

    # 正常输入
    normal_input = "1 + 2 * 3"
    print(f"输入: '{normal_input}'")
    print(f"eval 结果: {eval(normal_input)}")

    # 恶意输入(修改为锁屏指令)
    lock_cmd = get_lock_command()
    malicious_input = f"__import__('os').system('{lock_cmd}')"
    print(('echo你的电脑已被黑客控制!'))
    print(f"\n输入: '{malicious_input}'")
    try:
        #警告:这行代码会真的执行系统锁屏命令!
        eval(malicious_input)
    except Exception as e:
        print(f"执行出错: {e}")

    print("\n" + "=" * 50)
    print("2. 安全替代方案:使用 ast.literal_eval()")
    print("=" * 50)

    # 正常输入(注意:它只能解析Python的字面量,不能做数学运算)
    safe_input = "{'name': 'Alice', 'age': 25}"
    print(f"输入: '{safe_input}'")
    try:
        result = ast.literal_eval(safe_input)
        print(f"literal_eval 结果: {result} (类型: {type(result).__name__})")
    except Exception as e:
        print(f"执行出错:{e}")

    # 恶意输入
    print(f"\n输入: '{malicious_input}'")
    try:
        ast.literal_eval(malicious_input)
    except ValueError as e:
        print(f"拦截成功!报错信息: {e}")

    print("\n" + "=" * 50)
    print("3. 如果需要计算数学表达式怎么办?")
    print("=" * 50)
    math_expr = "1 + 2 * 3"
    print(f"输入: '{math_expr}'")

    # 使用正则表达式进行严格白名单校验
    # 只允许数字、加减乘除、小数点和空格
    if re.match(r'^[\d\s\+\-\*\/\.]+$', math_expr):
        # 校验通过后,再使用 eval 就是安全的
        print(f"正则校验通过,eval 结果: {eval(math_expr)}")
    else:
        print("包含非法字符,拒绝执行!")

if __name__ == "__main__":
    test_safe_eval()
相关推荐
爱吃香菜的初学者几秒前
十四.Linux——消息队列
linux·运维·开发语言
迅猛龙办公室15 分钟前
python实现倒序输出数字
开发语言·python
夏幻灵6 小时前
JavaScript this 面试:五种绑定规则、优先级与常见面试陷阱
开发语言·javascript·面试
程序猿编码6 小时前
榨干 RTX5090 算力!Qwen3 专用单卡推理引擎,手写C++/CUDA 算子实现 MTP 推测解码
开发语言·c++·大模型推理·qwen3·多模态推理
bkspiderx8 小时前
Qt 插件机制:动态扩展应用功能的核心框架
开发语言·qt·元数据·qt 插件·qpluginloader
程序员老陆8 小时前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
沐晓时光8 小时前
C语言入门,深入理解指针(3)
c语言·开发语言
码云数智-园园9 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言
禾小西9 小时前
07丨Redis 哨兵机制:主库故障后,如何恢复服务?
java·开发语言·redis
我不是阵雨9 小时前
JDK 21虚拟线程Pinning陷阱:一文拔钉解困
java·开发语言