django-csp避坑清单字符串当元组、self漏引号等5个经典配置错误【免费下载链接】django-cspContent Security Policy for Django.项目地址: https://gitcode.com/gh_mirrors/dj/django-cspdjango-csp 是为 Django 项目添加 Content-Security-PolicyCSP响应头的开源安全组件。新手配置时最容易踩的坑集中在类型写错、引号漏掉、新旧格式混用三类。本文整理 5 个高频配置错误帮你一次性避开这些隐形安全漏洞5 分钟完成自查。错误一EXCLUDE_URL_PREFIXES 写成字符串全站 CSP 失效 ⚠️这是最危险的一个坑。很多人会这样写CONTENT_SECURITY_POLICY { EXCLUDE_URL_PREFIXES: /admin, }后果Python 会把字符串按字符拆开/admin变成[/, a, d, m, ...]。由于几乎每个 URL 都以/开头所有请求都会命中排除规则CSP 头一个都不会下发——你以为加了防护实际裸奔。正确写法必须是 list 或 tupleEXCLUDE_URL_PREFIXES: [/admin],django-csp 内置了安全检查一旦写成字符串会直接报错csp.E002逻辑定义在 csp/checks.py 中。建议每次部署前都跑一遍python manage.py check错误二self忘了加引号策略静默失效 CSP 关键字如self、unsafe-inline在协议里必须带单引号。漏掉引号后self会被当成一个普通域名等于白配# ❌ 错误self 被当作域名 default-src: [SELF.replace(,)], # 别这么干 # ✅ 正确使用 csp.constants 提供的常量 from csp.constants import SELF, NONE, UNSAFE_INLINE default-src: [SELF, cdn.example.net],官方在 docs/configuration.rst 中特意用警告框标注了这一点4.0 版本起提供了 CSP 关键字常量就是为了消灭引号和拼写错误。推荐全部用 csp/constants.py 中的常量常量实际值NONEnoneSELFselfUNSAFE_INLINEunsafe-inlineSTRICT_DYNAMICstrict-dynamic错误三混淆 Python 的None和 CSP 关键字none这两个长得像作用完全相反新手必踩NONE来自 csp.constants值是none表示这个指令不允许任何来源会出现在响应头中。NonePython 关键字表示删除这个指令该指令将不会出现在响应头中。# 禁止任何外部图片 img-src: [NONE], # 完全移除 base-uri 指令 base-uri: None,典型事故想禁止一切却写成了None结果指令被删掉页面回退到default-src的宽松策略防护形同虚设。区分逻辑在 csp/utils.py 的build_policy函数中实现——值为None的指令会被直接跳过。错误四沿用 3.x 的CSP_XXX旧设置新格式全不生效 4.0 是不兼容升级所有CSP_DEFAULT_SRC、CSP_SCRIPT_SRC等旧前缀设置已被移除改为统一的字典格式。旧写法不会报错但策略直接消失。# ❌ 4.0 已失效 CSP_DEFAULT_SRC [self] # ✅ 新格式 CONTENT_SECURITY_POLICY { DIRECTIVES: { default-src: [SELF], }, }好消息是 csp/checks.py 注册了csp.E001检查运行python manage.py check时它会自动扫描旧设置并打印一份迁移好的新格式配置直接粘贴进settings.py即可。完整步骤见 docs/migration-guide.rst。注意两个容易忽略的换算CSP_INCLUDE_NONCE_IN [script-src]→ 改为在script-src列表中加入NONCE常量指令名要小写 短横线如default-src不能用下划线。错误五REPORT_PERCENTAGE 忘记从小数改成百分数 如果你配置了report-uri做违规上报还要注意这个数值陷阱# 旧版0.1 表示 10% CSP_REPORT_PERCENTAGE 0.1 # 新版必须写成 10.0范围 0.0 ~ 100.0 CONTENT_SECURITY_POLICY { REPORT_PERCENTAGE: 10.0, DIRECTIVES: {report-uri: /csp-report/}, }直接照抄旧数值0.1新版本会把它理解为 0.1%几乎收不到任何上报问题排查时一片空白。另外若需要限流上报务必使用 csp/contrib/rate_limiting.py 中的RateLimitedCSPMiddleware替代默认的CSPMiddleware。附赠Nonce 不生效两个前置条件必须同时满足 使用NONCE常量时很多用户发现脚本还是被拦截。原因通常是漏掉了条件指令中必须包含NONCE常量如script-src: [SELF, NONCE]请求生命周期内必须真正读取过request.csp_nonce比如模板里写nonce{{request.csp_nonce}}。只配置不读取时nonce 会被自动从响应头中剔除行为符合预期但容易误判为插件坏了。详细说明在 docs/nonce.rst 中nonce 生成逻辑见 csp/middleware.py 的CSPMiddleware。 小技巧nonce 值在浏览器开发者工具里看不到这是防恶意 CSS 泄露的设计要看值请用查看源码。快速自查清单 ✅配置完成后对照打勾EXCLUDE_URL_PREFIXES是 list/tuple不是字符串全部使用csp.constants常量无裸写的self字符串分清NONE禁止来源与None删除指令已删除所有CSP_前缀旧设置manage.py check无csp.E001REPORT_PERCENTAGE为 0~100 的百分数浮点用NONCE时模板中实际读取了request.csp_nonce按这份清单过一遍django-csp 的绝大多数配置了却没用的问题都能迎刃而解。祝你配置顺利网站安全无忧【免费下载链接】django-cspContent Security Policy for Django.项目地址: https://gitcode.com/gh_mirrors/dj/django-csp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考