直接写default-src 'self'会导致js/css加载失败,因为它禁止所有非同源资源,包括cdn脚本、内联代码、base64图片等,浏览器会拦截并报错;必须按实际资源路径精确配置各指令,漏配一项即可能白屏或功能异常。

CSP不是“开了就安全”,而是必须按实际资源加载路径精确配置,否则页面直接白屏或功能异常。
为什么直接写 default-src 'self' 会导致JS/CSS加载失败
这个策略会禁止所有非同源资源,包括 CDN 上的 jQuery、Google Fonts、内联样式和脚本——哪怕你只是用 <script>console.log(1)</script> 都会被拦截。浏览器控制台会报类似 Refused to load the script 'https://cdn.jsdelivr.net/npm/vue@3' 的错误。
- 内联脚本(
<script></script>标签内代码)默认被禁,需显式加'unsafe-inline'或用nonce - 内联样式(
style="color:red")同样被禁,style-src必须单独声明 -
img-src不继承default-src,如果用了 base64 图片或 emoji,得额外加data: - 字体、音视频、iframe 等资源类型都有对应指令,漏配一项就可能中断渲染
用 Flask-Talisman 设置 CSP 比手动 @app.after_request 更可靠
手动加头容易遗漏重定向响应、静态文件响应或错误页响应;Talisman 会统一覆盖所有响应路径,并支持开发/生产环境差异化配置。
- 安装:
pip install flask-talisman - 基础用法:
from flask_talisman import Talisman+Talisman(app, content_security_policy=csp_dict) - 开发时可临时放宽:
csp_dict = {"script-src": "'self' 'unsafe-inline'", "style-src": "'self' 'unsafe-inline'"} - 上线前必须移除
'unsafe-inline',改用nonce或哈希值(如sha256-...)
遇到 Refused to apply inline style 怎么快速定位
这不是代码写错了,是 CSP 拦截了未授权的样式来源。先确认问题是否复现于 Chrome DevTools → Console → Security 标签页,再检查三处:
- HTML 中是否有
style="..."属性?→ 改用 class + 外部 CSS,或在style-src加'unsafe-inline'(仅临时) - 是否用了第三方 UI 库(如 Bootstrap、Ant Design)?→ 查它文档里明确列出的 CSP 要求,比如 Ant Design 依赖
font-src允许 data: 和 fonts.gstatic.com - Flask 渲染模板时是否用了
{{ html|safe }}?→ 这会绕过 Jinja2 转义,若内容含 style 属性,CSP 会拦截,应改用白名单过滤或预处理
AI 输出 HTML 时 CSP 必须禁用 eval 和内联脚本
当你的 Flask API 返回 LLM 生成的 HTML(比如数学解题步骤带高亮代码块),即使前端用 innerHTML 插入,CSP 也必须堵死执行通道。
- 必须包含:
script-src 'self' 'unsafe-eval'→ 绝对不要加,改用script-src 'self'+ 显式加载 JS 文件 - 若 AI 输出含
<script></script>标签,应在后端用正则或 HTML 解析器剥离,而不是靠 CSP “兜底” - 推荐组合:
default-src 'self'; script-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'—— 这能拦住绝大多数 XSS 载荷,包括javascript:伪协议
真正麻烦的从来不是写对那几行 CSP 指令,而是每次加一个新 CDN、换一套 UI 组件、接入一个分析脚本,都得重新校验全部指令是否兼容——漏掉一个 connect-src 就会让前端埋点失效,而错误日志里只有一句模糊的“blocked by CSP”。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











