Python eval安全隐患
代码注入等威胁
1、锁屏
importosprint(os.system('rundll32.exe user32.dll,LockWorkStation'))2、eval注入风险
importastimportreimportplatformdefget_lock_command():"""根据当前操作系统返回对应的锁屏命令"""os_type=platform.system()ifos_type=="Windows":# Windows 锁屏命令return"rundll32.exe user32.dll,LockWorkStation"elifos_type=="Linux":# Linux GNOME桌面环境锁屏命令return"gnome-screensaver-command -l"elifos_type=="Darwin":# macOS 锁屏命令return"pmset displaysleepnow"else:return"echo 不支持的操作系统"deftest_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)exceptExceptionase: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__})")exceptExceptionase:print(f"执行出错:{e}")# 恶意输入print(f"\n输入: '{malicious_input}'")try:ast.literal_eval(malicious_input)exceptValueErrorase:print(f"拦截成功!报错信息:{e}")print("\n"+"="*50)print("3. 如果需要计算数学表达式怎么办?")print("="*50)math_expr="1 + 2 * 3"print(f"输入: '{math_expr}'")# 使用正则表达式进行严格白名单校验# 只允许数字、加减乘除、小数点和空格ifre.match(r'^[\d\s\+\-\*\/\.]+$',math_expr):# 校验通过后,再使用 eval 就是安全的print(f"正则校验通过,eval 结果:{eval(math_expr)}")else:print("包含非法字符,拒绝执行!")if__name__=="__main__":test_safe_eval()