django-check-security仅检测已知安全模式,无法发现业务逻辑漏洞;需配合bandit扫描、人工核对中间件顺序与csp策略、sentry初始化移至asgi.py/wsgi.py并过滤敏感数据。

django-check-security 不能替代人工审计
自动扫描工具只抓已知模式,比如硬编码密钥、DEBUG=True 部署、不安全的 SECRET_KEY 生成方式。它不会发现业务逻辑漏洞(如越权访问订单详情)、自定义中间件里的 session 泄露,或模板中未转义的用户输入拼接。
实操建议:
- 用
pip install django-check-security安装后,运行python manage.py check --deploy—— 这会触发 Django 内置的生产环境检查,包括ALLOWED_HOSTS是否为空、DEBUG是否为True等 - 配合
bandit扫描整个项目:运行bandit -r . --skip B101,B301(跳过基础断言和 pickle 警告,聚焦高危点) - 重点人工核对:
MIDDLEWARE顺序(SecurityMiddleware必须靠前)、CSP策略是否覆盖所有内联脚本、SESSION_COOKIE_SECURE和CSRF_COOKIE_SECURE在 HTTPS 环境下是否启用
Sentry 初始化必须避开 settings.py 的 DEBUG 分支
很多人把 sentry_sdk.init() 写在 settings.py 里,又用 if DEBUG: 包裹——结果线上环境完全没上报。更隐蔽的问题是,在多配置文件结构(如 settings/base.py + settings/prod.py)中,忘记在 prod 文件里调用初始化。
实操建议:
- 把
sentry_sdk.init()移到asgi.py或wsgi.py底部,确保每次进程启动必执行 - 传参时显式关闭开发模式:用
environment="production"、release=os.environ.get("RELEASE_VERSION"),避免依赖DEBUG值判断 - 加一行验证:初始化后立即触发一次测试异常,比如
try: 1/0 except Exception: sentry_sdk.capture_exception(),上线前手动 curl 一次健康接口确认有事件进 Sentry
Django 日志与 Sentry 的错误重复捕获冲突
默认 LOGGING 配置里如果用了 handlers = ['sentry'],再配 sentry_sdk.init(),同一个异常会被发两次——Sentry 后台看到重复事件,排查时浪费时间;更糟的是,某些日志 handler(如 SMTPHandler)可能因重试失败拖慢响应。
实操建议:
- 禁用日志侧的 Sentry handler,只保留
sentry_sdk的自动异常捕获 - 若需记录特定业务异常到日志(如支付失败),用
logger.exception("Payment failed", exc_info=True),它不会触发 Sentry 二次上报 - 在
sentry_sdk.init()中设置integrations=[DjangoIntegration(transaction_style="function_name")],避免 URL 参数污染 transaction 名称
敏感数据泄露常发生在 Sentry 的 request.data 和 extra context
默认情况下,sentry_sdk 会自动采集 request.POST、request.GET、request.META,而用户登录密码、身份证号、银行卡号可能就藏在这些字段里。即使你没主动传 extra,Django 的 get_user() 也可能把 user.email、user.last_login 带进去。
实操建议:
- 初始化时加过滤:用
before_send回调删字段,例如过滤掉password、id_card、token键名(注意大小写和嵌套) - 不要在
extra里塞 model 实例,改用str(obj.id)或obj.pk;避免repr(user),它可能打印出原始字段值 - 在 Sentry 项目设置里开启
scrub_sensitive_data,并配置正则规则匹配中文身份证、16/19 位数字卡号等
最麻烦的不是配置,而是每次加新 API 接口或改表单字段时,得同步更新 scrub 规则——没人真记得住。上线前跑一遍 curl -X POST -d "password=123&card=6228480000000000000" http://yoursite.com/api/login,看 Sentry 事件里还剩多少明文。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











