别再把 secrets 写进代码里了
硬编码密钥 = 给黑客发邀请函。
你是不是也这样写过?
API_KEY = "sk-xxxxxx-your-secret-key"
GitHub 每天扫描出 超 10 万条泄露的密钥,其中 Python 项目占三成。
用环境变量才靠谱:
import os
API_KEY = os.getenv("API_KEY")
配合 .env 文件 + .gitignore,安全系数直接拉满🔒。
你以为 eval 很酷?它可是“后门生成器”
eval(input()) = 执行任意代码。
新手教程里常这么教,但现实里等于自杀:
# 千万别这么干!
user_input = input("Enter expression: ")
result = eval(user_input) # 输入 __import__('os').system('rm -rf /') 就完了
替代方案?用 ast.literal_eval() 只解析安全字面量:
import ast
try:
result = ast.literal_eval(user_input)
except (ValueError, SyntaxError):
print("非法输入!")
SQL 注入?你的 ORM 可能也在“裸奔”
拼接 SQL 字符串 = 开门迎贼。
即使你用了 SQLAlchemy,也可能中招:
# 错误示范
query = f"SELECT * FROM users WHERE name = '{username}'"
正确姿势是用参数化查询:
# 安全写法
session.execute(select(User).where(User.name == username))
# 或原生 SQL
conn.execute("SELECT * FROM users WHERE name = %s", (username,))
SQLAlchemy 默认防注入,但手动拼接字符串就前功尽弃。
依赖库?可能是定时炸弹💣
一个恶意包就能接管你的服务器。
2023 年 PyPI 下架了 超 400 个恶意包,伪装成工具库窃取 AWS 凭据。
检查依赖是否干净:
pip install pip-audit
pip-audit # 扫描已知漏洞
锁定版本 + 定期更新:
# requirements.txt
requests==2.31.0 # 别用 >=
更狠一点?用 pip-tools 管理哈希校验:
pip-compile --generate-hashes requirements.in
日志里藏着你的“社死现场”
print 敏感信息 = 公开处刑。
你 debug 时是不是这样写过?
print(f"User {email} logged in with password {password}") # 😱
日志可能被存到 ELK、Splunk,甚至 GitHub Actions 日志里!
正确做法:永远不记录密码、token、身份证号。
用结构化日志 + 过滤器:
import logging
logging.basicConfig(level=logging.INFO)
# 只记录用户ID,不记录凭证
logging.info("User %s logged in", user_id)
如果必须记录上下文,用 structlog 自动脱敏:
import structlog
logger = structlog.get_logger()
logger.info("login_attempt", email=email) # 配置过滤器自动屏蔽敏感字段
安全不是功能,是底线
Python 的简洁让人放松警惕,但越简单的语言,越容易写出高危代码。
这五个雷区,我见过太多团队踩过——包括我自己早年写的“祖传屎山”。
别等数据泄露上新闻才后悔。
现在花 10 分钟检查一遍,胜过事后百万赔偿。
毕竟,你的代码,可能正在替你“裸奔”给全世界看 👀。