如何确保通过CDN传送的JavaScript文件不会被更改?

bab*_*a26 88 javascript code-signing

我正在开发一些场景,其中一些JavaScript文件将托管在CDN上.我希望有一些机制,以便在用户端下载这些文件时,我可以确保文件没有被篡改,并且确实来自指定的CDN.

我知道如果我使用SSL,任务很容易,但我仍然希望确保即使在没有SSL的HTTP上也能提供正确的文件.

据我所知,没有现成的机制,如JavaScript文件的数字签名,跨平台支持.也许不需要它?

是否有一些内置于浏览器中的方法来验证JavaScript文件的作者?我能以安全的方式做些什么吗?

Tim*_*imo 140

事实上,目前正在Subresource Integrity的名义起草这样的功能.查看标签的integrity属性<script>. 虽然尚未全面采用,但它实现了这一目的.

integrity

包含内联元数据,用户代理可以使用该元数据来验证已提供的已获取资源是否没有意外操作.请参阅子资源完整性.

资源

子资源完整性(SRI)是一种安全功能,使浏览器能够验证他们获取的文件(例如,来自CDN)是否在没有意外操作的情况下传递.它的工作原理是允许您提供所提取文件必须匹配的加密哈希.

资源


例:

<script src="https://example.com/example-framework.js"
    integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
    crossorigin="anonymous"></script>
Run Code Online (Sandbox Code Playgroud)

但请注意,如果您通过普通HTTP传输资源,这将无法保护您免受中间人攻击.在这种情况下,攻击者可以欺骗哈希码,使得对被操纵的脚本文件的防御变得无用.

因此,除了上述安全措施之外,您应始终使用安全HTTPS连接而不是纯HTTP.

  • @TimoSta没错!如果没有这些检查,如果您包含来自例如`https:// code.jquery.com /`的脚本,那么任何妥协`code.jquery.com`的人都可以XSS您的网站,无论是否通过HTTPS访问`code.jquery.com`.随着这些检查到位,攻击者只能阻止脚本加载,没有恶意的人替换它们. (10认同)
  • 我认为这是值得一提的是,完整性检查可以很容易地被欺骗假设OP计划派遣他们在HTTP HTML以及他们的资源文件.如果他们的网站是HTTPS,他们希望通过HTTP服务的资产则大多数浏览器都不会喜欢这一点,并静静地忽略了HTTP资产. (9认同)
  • @MonkeyZeus这只会是真实的,虽然在MITM攻击,或者如果我们自己的服务器被攻破,正确的呢?我的理解是,这个问题明确要求如何抵御损害CDN. (3认同)

Bri*_*ian 36

您正在寻找子资源完整性检查.

例如,这是jQuery CDN片段:

<script src="https://code.jquery.com/jquery-3.1.0.js"
        integrity="sha256-slogkvB1K3VOkzAI8QITxV3VzpOnkeNVsKvtkYLMjfk="
        crossorigin="anonymous"></script>
Run Code Online (Sandbox Code Playgroud)

  • @LightnessRacesinOrbit:如果您控制自己的域,而不是通过HTTPS访问但不控制`code.jquery.com`,则不会.这可以保护您免受受损的`code.jquery.com`. (15认同)
  • 完全没用,因为攻击者可以在修改您正在下载的脚本的同时修改完整性字段. (2认同)
  • @SilverlightFox:好的,对MITM攻击毫无用处* (2认同)

Fab*_*ini 6

免责声明:与往常一样,您应该只考虑这些机制在使用https时有用,因为它们可以通过MitM轻松禁用

除了上述答案中的机制外,您还可以在父页面上使用内容安全策略 http响应标头.

http://www.html5rocks.com/en/tutorials/security/content-security-policy/

Content-Security-Policy:script-src'sha256-qznLcsROx4GACP2dm0UCKCzCG-HiZ1guq6ZZDob_Tng ='

这里有几点需要注意.sha* - 前缀指定用于生成哈希的算法.在上面的示例中,使用sha256-.CSP还支持sha384-和sha512-.生成哈希时不包含标记.大写和空白也很重要,包括前导或尾随空格.

使用Chrome 40或更高版本,您可以打开DevTools然后重新加载页面."控制台"选项卡将包含每个内联脚本的正确sha256哈希值的错误消息.

这种机制已存在很长一段时间了,所以浏览器支持可能还不错,请务必检查.

此外,如果要确保旧的不兼容的浏览器不安全,可以在页面顶部包含策略不允许的同步重定向脚本.