Python安全系统学习路线第240讲_核心原理与实战案例详解【指导】

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

这个标题没有实际技术指向,无法对应到具体可操作的问题或知识点。

Python 安全系统本身不是标准术语——它可能指代 Web 安全(如 Flask/Django 的 CSRF、SQL 注入防护)、密码学应用(cryptography 库)、沙箱机制、AST 代码审计、或是第三方安全工具(如 banditpylint 的安全规则)。

如果你遇到的是以下某类问题,才值得深入:

为什么 eval() 在 Web 接口里直接用会触发 RCE?

根本原因不是 eval() 本身“危险”,而是它在未过滤用户输入时,把字符串当作 Python 代码执行。攻击者可传入 "__import__('os').system('id')" 这类 payload。

  • 永远不要对不可信输入调用 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 哈希)。

这些细节不写进日志、不报错、不崩溃,但上线后就是漏洞。