没有SSL情况下,如何临时解决流量劫持?

如果 CDN 服务器被入侵,导致静态文件在服务器上被篡改,发布机上的 HTTPS 也无能为力。本文是在没有 SSL 的基础上,浅谈以下利用 SRI 和 CSP 防止劫持,但这个方法治标不治本,真正要想避开流量劫持,最好的方案还是使用 HTTPS。

在没有 HTTPS 的情况下,SRI 的验证可能被直接修改页面文件而绕过,而 SRI 的白名单就给其造成了一定的难度。换句话说,这两者结合起来,也只是加大了流量劫持的成本,并没有从根本上解决问题,只要你的网络服务商愿意,还是可以劫持的。

SRI 是 Subresource Integrity 的缩写,主要是防止放置在 CDN 上的静态文件被篡改,减少由此引起的 XSS 风险。

CSP 全称 Content Security Policy,用来指定页面允许被加载的资源,减少 XSS 的可能性。

SRI 主要是补足 CSP 的不足,当 CDN 资源文件被篡改时,该文件肯定是在 CSP 的白名单内的,因而此时有可能引发 XSS。而 SRI 通过在页面引用资源时指定资源的摘要签名,来实现让浏览器验证资源是否被篡改的目的。

要想页面支持 CSP,只要服务器输出如下相应头就可以

Content-Security-Policy: default-src ‘self'

具体支持可以查看本文末尾“参考资料 1”

要使用 SRI,只需要将资源文件以如下方式引入即可(采用Bootstrap作为示例):

<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous”>

将引入资源使用对应的算法计算摘要之后,再将结果进行 Base64 转码,比如上面的便是使用 sha384 进行摘要后 Base64,其结果为 BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u

其支持算法为:sha256sha384sha512.

目前来看,CSP 的局限性在于其不支持所有浏览器,而 SRI 的局限性在于,一旦流量劫持,则文件可能无法通过验证,使全页面加载错误(或部分渲染),但也有一定的解决办法,就是使用 JS,在页面无法加载的时候重新加载。

参考资料:

  1. http://www.w3.org/TR/CSP/
  2. https://www.w3.org/TR/SRI/

共有 0 条评论

Top