加载笔记内容...
加载笔记内容...
深入解析 Web 安全三剑客:CSP、CSRF 与 MITM 防御
——从策略配置到协议层防御的全链路实践
CSP 的本质是通过声明式策略控制资源加载,其核心机制是浏览器对 白名单机制 的强制执行。通过 Content-Security-Policy
响应头,开发者可以精确控制脚本、样式、多媒体等资源的加载源,从而有效防御 XSS 和数据注入攻击。
示例配置中的 img-src *
看似灵活,实则暗藏风险:
1Content-Security-Policy:
2 default-src 'self';
3 img-src *;
4 media-src media1.com media2.com;
5 script-src userscripts.example.com;
default-src 'self'
:默认策略的"安全基线"作用,避免遗漏未显式声明的内容类型img-src *
的隐患:允许任意图片源可能导致 图片劫持攻击(如 EXIF 数据泄露),建议升级为 img-src https:
或限定可信 CDN 域名media-src
未包含子域名时,可通过 media-src *.media1.com
扩展,或通过 frame-src
控制嵌套内容unsafe-inline
时,所有内联脚本(包括常见前端框架的初始化代码)将被拦截
1<script nonce="EDNnf03nceIOfn39fn3e9h3sdfa">
2 // 允许执行的非内联脚本
3</script>
script-src 'strict-dynamic'
可兼容动态脚本加载(如 Webpack 生成的 chunk)report-uri /csp-report-endpoint
收集策略违规日志,用于策略调优CSRF 攻击利用的是 浏览器自动携带 Cookie 的机制,防御需要构建多层级校验体系。
1# Django 的实现示例
2from django.middleware.csrf import get_token
3def generate_csrf_token(request):
4 token = get_token(request) # 基于会话ID与时间戳的HMAC加密
5 return token
redis-cluster
实现跨节点同步Chrome 80+ 已默认开启 SameSite=Lax
,这改变了传统的防御格局:
<img src="https://bank.com/transfer?to=attacker">
虽然规避了 Session 存储,但存在 子域名漏洞:
1攻击者控制 sub.hack.com 设置 Cookie
2(Domain=.hack.com)
3当用户访问 legit.com 时,若该站允许 *.hack.com 则可能泄露 Cookie
解决方案:验证 Cookie 的 Domain/Path 属性,或结合 Origin 头校验
1add_header Strict-Transport-Security
2 "max-age=63072000; includeSubDomains; preload";
preload
列表需提交至 Chrome HSTS Preload List1example.com. IN CAA 0 issue "letsencrypt.org"
当 XSS 与 CSRF 结合时,传统防御可能失效:
立体化防御方案:
script-src-elem
与 script-src-attr
实现更细粒度控制结语
Web 安全防御是持续演进的系统工程。开发者需建立"纵深防御"思维,既要在协议层筑牢基础,也要在业务层实现精准管控,更需关注浏览器生态的最新动向。只有将标准规范、工程实践、威胁情报三者结合,才能构建真正可靠的防御体系。