你有没有遇到过这种情况:明明访问的是一个 HTTPS 网站,地址栏也显示了小绿锁,但浏览器却在控制台报出一堆警告,提示某些资源加载失败?其实,这很可能不是网站坏了,而是内容安全策略(Content Security Policy,简称 CSP)在起作用。
为什么 HTTPS 网站还会加载不安全资源?
很多人以为只要网站用了 HTTPS,所有内容就自动安全了。但事实并非如此。HTTPS 只保证传输过程加密,而网页中引用的图片、脚本、样式表等资源,仍可能来自 HTTP 地址。比如,一个 HTTPS 页面里嵌入了这样一段代码:
<script src="http://example.com/analytics.js"></script>
这个脚本虽然能加载,但因为是通过明文 HTTP 传输,中间人可以篡改内容,植入恶意代码。浏览器检测到这类混合内容(Mixed Content),通常会阻止加载或给出警告。
CSP 如何防止资源被滥用
内容安全策略是一种 HTTP 响应头,用来告诉浏览器哪些外部资源可以加载,哪些必须拒绝。它像一道防火墙,直接在客户端层面限制资源来源。比如,下面这条策略:
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com; img-src *; object-src 'none'
它的意思是:默认只允许加载同源资源;脚本只能来自自身域名或指定的 HTTPS CDN;图片可以来自任何地方;禁止加载插件类对象(如 Flash)。这样一来,即使页面被注入了恶意脚本标签,只要来源不在白名单内,浏览器就不会执行。
实际场景中的问题
某公司官网全面启用了 HTTPS,但在首页轮播图中引用了第三方广告图,链接却是 HTTP 的。上线后发现部分用户看到图片无法显示。查看控制台才发现,现代浏览器已默认阻止主动混合内容(如脚本、iframe),被动内容(如图片、音频)也可能被拦截。解决方法很简单:把广告资源换成 HTTPS 链接,或者在 CSP 中明确允许该域:
Content-Security-Policy: img-src 'self' https://ads.third-party.com
合理配置 CSP 才能真正起效
有人为了省事,写成 script-src *,看似解决了问题,实则等于没设防。正确的做法是先用报告模式测试:
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report-endpoint
这样浏览器不会真正阻止资源,但会把违规行为发到指定接口,开发者可以根据日志逐步调整策略。等确认无误后再切换到强制执行模式。
另外,内联脚本(如 <script>alert(1)</script>)也是常见攻击入口。CSP 默认禁止内联脚本,除非加上 'unsafe-inline' —— 但这就像给防盗门留个通风口,得不偿失。推荐做法是把脚本移到外部文件,或使用哈希值白名单:
script-src 'sha256-B21q9ac8Y4fBBu+eN8Q='
这样只有匹配哈希的脚本才能运行,既灵活又安全。
现在越来越多网站开始重视 CSP 的配置,尤其是银行、电商这类敏感平台。一个小疏忽可能导致用户数据泄露,而一条严谨的策略能在攻击发生前就切断路径。安全不是靠一个绿锁就能完成的事,每一个资源的加载,都值得被认真对待。