背景
有一个客户需要对以前老项目部分功能进行升级,需要升级页面按照最新版本的内容进行更新,测试发现页面无法加载。F12使用开发者工具发现所有资源文件异常,所有的资源文件竟然自动将HTTP协议换成 HTTPS 协议。异常信息如下图所示:

项目目前部署是非HTTPS的,很奇怪为什么会自动转换为HTTPS资源。经过排查在异常页面中发现了问题,在head节点下发现以下代码
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
以上内容会将HTTP协议自动转换为HTTPS协议。
Content-Security-Policy
Content-Security-Policy(CSP)允许站点管理者控制用户代理能够为指定的页面加载哪些资源。除了少数例外情况,设置的政策主要涉及指定服务器的源和脚本结束点。这将帮助防止跨站脚本攻击(Cross-Site Script)。
CSP 的实质就是白名单制度,大大增强了网页的安全性。攻击者即使发现了漏洞,也没法注入脚本,除非还控制了一台列入了白名单的可信主机。
两种方法可以启用 CSP。一种是通过 HTTP 头信息的Content-Security-Policy的字段。
另一种是通过网页的<meta>标签。
- 脚本:只信任当前域名
<object>标签:不信任任何URL,即不加载任何资源- 样式表:只信任
cdn.example.org和third-party.org - 框架(
frame):必须使用HTTPS协议加载 - 其他资源:没有限制
限制选项
资源加载限制
以下选项限制各类资源的加载。
script-src:外部脚本style-src:样式表img-src:图像media-src:媒体文件(音频和视频)font-src:字体文件object-src:插件(比如Flash)child-src:框架frame-ancestors:嵌入的外部资源(比如<frame>、<iframe>、<embed>和<applet>)connect-src:HTTP连接(通过XHR、WebSockets、EventSource等)worker-src:worker脚本manifest-src:manifest 文件
default-src
default-src用来设置上面各个选项的默认值。
Content-Security-Policy: default-src 'self
上面代码限制所有的外部资源,都只能从当前域名加载。
如果同时设置某个单项限制(比如font-src)和default-src,前者会覆盖后者,即字体文件会采用font-src的值,其他资源依然采用default-src的值。
URL 限制
有时,网页会跟其他 URL 发生联系,这时也可以加以限制。
frame-ancestors:限制嵌入框架的网页base-uri:限制<base#href>form-action:限制<form#action>
其他限制
其他一些安全相关的功能,也放在了 CSP 里面。
block-all-mixed-content:HTTPS网页不得加载HTTP资源(浏览器已经默认开启)upgrade-insecure-requests:自动将网页上所有加载外部资源的HTTP链接换成HTTPS协议plugin-types:限制可以使用的插件格式sandbox:浏览器行为的限制,比如不能有弹出窗口等。
支付宝扫码打赏
微信打赏