Python eval安全隐患
代码注入等威胁1、锁屏importosprint(os.system(rundll32.exe user32.dll,LockWorkStation))2、eval注入风险importastimportreimportplatformdefget_lock_command():根据当前操作系统返回对应的锁屏命令os_typeplatform.system()ifos_typeWindows:# Windows 锁屏命令returnrundll32.exe user32.dll,LockWorkStationelifos_typeLinux:# Linux GNOME桌面环境锁屏命令returngnome-screensaver-command -lelifos_typeDarwin:# macOS 锁屏命令returnpmset displaysleepnowelse:returnecho 不支持的操作系统deftest_safe_eval():print(*50)print(1. 危险操作使用 eval())print(*50)# 正常输入normal_input1 2 * 3print(f输入: {normal_input})print(feval 结果:{eval(normal_input)})# 恶意输入修改为锁屏指令lock_cmdget_lock_command()malicious_inputf__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:resultast.literal_eval(safe_input)print(fliteral_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_expr1 2 * 3print(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()