浏览器端的威胁防御
1、用且仅用 HTTPS,防范网络攻击
众所周知,一个安全的应用需要对浏览器和 Web 服务器之间的所有连接进行加密。此外,建议禁用一些旧的密码套件和协议。
使用 HTTPS 时,仅加密网站的“敏感”部分是不够的。如非这样,攻击者可以截获某个未加密的 HTTP 请求,然后伪造来自服务器的响应,返回恶意内容。
幸运的是,HTTPS 目前是很容易做到的。我们可以通过 Let’s Encrypt 免费获得证书,加上 CertBot 免费续期。
继续我们的清单,下一个是 HSTS 它与 HTTPS 密切相关。
2、使用 HSTS 和预加载来保护用户免受 SSL 剥离攻击
服务器可以用 HSTS 或 Strict Transport Security header 来强制进行加密连接。它表示需要一直使用 HTTPS 连接访问网站。
HSTS 可以防止 SSL 剥离攻击。所谓的 SSL 剥离攻击也就是:网络上的攻击者截获浏览器发出的第一个 HTTP 请求(通常是未加密的),并立即伪造对该请求的回复,假装是服务器并将连接降级为明文 HTTP。
值得注意的是,HSTS 仅在用户至少成功访问了一次应用程序的情况下才能生效。为了克服这个限制,可以把我们的网站提交到 https://hstspreload.org ,这样,各浏览器便可以将我们的域名通过硬编码写入到 HSTS 列表中。
如下:
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
警告:
在实施 HSTS 时,将会强制进出该网站的所有网络请求均被加密,如果网站请求中仍然有纯文本,可能无法访问。所以,先设置一个小的 max-age 参数进行调试,如果一切正常工作,再加大这个值。调试成功后再加上预加载 (preload) ,把开启预加载保留在最后一步,因为关闭它是件很麻烦和痛苦的事情。
3、设置安全 Cookie,保护用户免受网络攻击
给 Cookie 加上 Secure 属性。此属性将防止 Cookie 在(意外或强制的)未加密的连接中泄漏。
Set-Cookie: foo=bar; ...other options... Secure
4、安全生成 HTML 以避免 XSS 漏洞
要避免 XSS(跨站点脚本)漏洞,可以采用下面两种方法:
-
完全静态的网站(例如 JavaScript SPA + 后端API)。避免生成 HTML 问题的最有效方法是根本不生成HTML,如前述方法,当然,也可以试试很酷的 NexJS。
-
模板引擎。针对传统的 Web 应用程序,其中的 HTML 大多是在后端服务器上根据提供参数动态生成的。这种情况下,不要通过字符串连接来创建 HTML 。推荐的做法是使用模板引擎,比如 PHP 语言的 Twig、Java 语言的 Thymeleaf、Python 语言的 Jinja2 等等。
① 2000多本网络安全系列电子书
② 网络安全标准题库资料
③ 项目源码
④ 网络安全基础入门、Linux、web安全、攻防方面的视频
⑤ 网络安全学习路线图
【点击这里】
此外,务必要正确配置模板引擎,从而可以自动对参数进行编码,并且不要使用任何可以绕过这种编码的“不安全”函数。不要把 HTML 放在回调函数、属性(不带引号)或 href/src 等诸如此类的地方。
5、安全使用 JavaScript 以避免 XSS 漏洞
要避免 JavaScript 端的 XSS(跨站点脚本)漏洞,切忌将不受信任的数据传递到可执行代码的函数或属性中。这类常见的函数或属性包括:
-
eval、setTimeout、setInterval 等。
-
innerHTML