Python 如何避免代码注入攻击?
我有一个项目,需要接收 python 脚本,这些脚本都是字符串,我会对这些字符串进行编译然后执行。这是前提也是基础必要,如果在这种前提下,如何避免脚本中出现的恶意代码,例如写 while 死循环,创建文件,创建进程线程,或者通过 os,sys 模块调用系统功能?或者如何实现对脚本的检测,或者将整个编译过程放置一个沙盒中运行?有没有朋友可以提供些有用建议,万分感谢
Python 如何避免代码注入攻击?
7 回复
静态检查 https://github.com/PyCQA/bandit
至于沙箱的话,看看这个 https://wiki.python.org/moin/SandboxedPython
PyPy 自带沙箱 http://doc.pypy.org/en/latest/sandbox.html
帖子标题:Python 如何避免代码注入攻击?
要避免Python中的代码注入攻击,核心原则是永远不要信任外部输入,并严格区分代码和数据。以下是几个关键场景和对应的防御方法:
- SQL注入:这是最常见的注入攻击。
- 错误做法:使用字符串拼接将用户输入直接嵌入SQL语句。
# 危险!极易被注入 user_input = "'; DROP TABLE users; --" query = f"SELECT * FROM users WHERE name = '{user_input}'" - 正确做法:使用参数化查询。所有主流数据库驱动(如
sqlite3,psycopg2,mysql-connector-python)都支持。
原理:数据库驱动会确保输入被正确地转义和处理为纯数据,而不是可执行代码的一部分。import sqlite3 conn = sqlite3.connect('example.db') cursor = conn.cursor() # 安全:使用 ? 作为占位符 user_input = "'; DROP TABLE users; --" cursor.execute("SELECT * FROM users WHERE name = ?", (user_input,)) # 或者使用命名占位符 cursor.execute("SELECT * FROM users WHERE name = :name", {'name': user_input})
- 命令注入(如通过
os.system,subprocess调用系统命令):
- 错误做法:直接将用户输入拼接到命令字符串中。
import os filename = input("Enter filename: ") # 用户输入:`test.txt; rm -rf /` os.system(f"cat {filename}") # 灾难! - 正确做法:使用
subprocess.run并传递参数列表,避免使用shell=True。
原理:每个参数都被视为独立的字符串,Shell解释器不会介入解析。import subprocess filename = input("Enter filename: ") # 安全:参数作为列表传递,shell=False是默认值 result = subprocess.run(['cat', filename], capture_output=True, text=True)
- eval() 和 exec() 注入:
- 黄金法则:绝对不要对来自不可信源(如用户输入、网络请求、文件)的字符串使用
eval()或exec()。 - 替代方案:
- 使用
ast.literal_eval()来安全地评估只包含Python字面量(字符串、数字、元组、列表、字典、布尔值、None)的字符串。它不会执行任何函数或方法。import ast user_data = '{"name": "Alice", "age": 30}' # 一个JSON字符串 safe_dict = ast.literal_eval(user_data) # 安全地转换为字典 - 对于配置或数据交换,使用标准格式如JSON (
json.loads())、YAML (yaml.safe_load()) 并确保使用其安全加载方法。
- 使用
- 模板注入(如使用Jinja2, Django模板):
- 错误做法:在渲染模板前对用户输入进行不安全的拼接或预处理。
- 正确做法:现代模板引擎(Jinja2, Django Templates)默认会自动对渲染的变量进行HTML转义,以防止XSS攻击。确保你没有使用
|safe过滤器或Markup类来绕过这个保护,除非你完全确信内容是安全的。
总结建议:对任何外部输入进行验证、转义或使用安全的API来处理。
感谢
可以使用扔到 docker 里执行,然后 wait 一个超时时间
docker-py 很调几个 api 就能实现
fix 很调 /调用
OJ ?
OJ +1

