Python安全无标准术语,需明确场景:禁用eval/exec防RCE;密码存储禁用MD5,须用PBKDF2或Argon2加盐;bandit可扫硬编码密码但不查.env;细节疏漏(如debug=True、字段长度不足)常致生产漏洞。

这个标题没有实际技术指向,无法对应到具体可操作的问题或知识点。
Python 安全系统本身不是标准术语——它可能指代 Web 安全(如 Flask/Django 的 CSRF、SQL 注入防护)、密码学应用(cryptography 库)、沙箱机制、AST 代码审计、或是第三方安全工具(如 bandit、pylint 的安全规则)。
如果你遇到的是以下某类问题,才值得深入:
为什么 eval() 在 Web 接口里直接用会触发 RCE?
根本原因不是 eval() 本身“危险”,而是它在未过滤用户输入时,把字符串当作 Python 代码执行。攻击者可传入 "__import__('os').system('id')" 这类 payload。
立即学习“Python免费学习笔记(深入)”;
- 永远不要对不可信输入调用
eval()、exec()、compile() - 若必须动态求值,改用
ast.literal_eval()(只支持字面量:数字、字符串、元组、列表、字典等) - Django 模板引擎默认禁用 Python 代码执行,但自定义模板标签若用了
eval(),就等于绕过整个防护层
hashlib.md5() 为什么不能用于密码存储?
MD5 是快速哈希,且无盐(salt),现代 GPU 可在一秒内穷举数亿个常见密码。它设计目标是校验完整性,不是抗暴力破解。
- 密码必须用专用密钥派生函数:Python 标准库推荐
hashlib.pbkdf2_hmac()或更优的passlib+argon2 - 务必加随机 salt,且每次生成新 salt(不要复用)
- Web 框架如 Flask-Login 不处理密码哈希,需自行集成;Django 的
User.set_password()已默认用 PBKDF2
如何用 bandit 扫描项目里的硬编码密码?
bandit 是基于 AST 的静态分析工具,能识别如 password = "123456"、requests.get("http://user:pass@host") 这类高危模式。
- 安装后运行:
bandit -r myproject/
- 它默认不检查
.env文件,硬编码在环境文件里不会被发现——得靠dotenv-linter或 CI 阶段禁止提交含PASSWORD=的文件 - 误报常见于测试代码,可用
# noqa: B105忽略单行,但别批量禁用规则
真正卡住人的,往往不是原理听不懂,而是:
- 把开发期便利写法(比如本地调试用的
debug=True)带进生产环境; - 认为用了 HTTPS 就不用防 XSS,或用了 ORM 就不会 SQL 注入;
- 密码哈希逻辑写对了,但数据库字段长度只留了 32 字符(不够存 argon2 哈希)。
这些细节不写进日志、不报错、不崩溃,但上线后就是漏洞。










