XSS Lock

XSS Lock

XSS锁(Cross-Site Scripting Lock)是一种防止跨站脚本(XSS)攻击的安全机制。

XSS攻击是一种代码注入攻击,攻击者向网页中注入恶意脚本,当用户浏览该页面时,脚本会在用户浏览器中执行,盗取用户数据等。

为了防止XSS攻击,浏览器提供了XSS锁功能:

浏览器会检测页面是否包含可执行代码,如 <script> 标签。

如果页面包含可执行代码,则浏览器会触发XSS锁,禁用页面中的脚本代码。

网页需要通过特定的方法解除锁定,才能恢复脚本执行能力,如使用 nonce 属性等。

这样可以阻止非授权的脚本代码执行,防止XSS攻击。

启用XSS锁的方法:

  • 设置 HTTP Content-Security-Policy 报文头,启用XSS过滤。
  • 在高危页面加入 nonce 属性,浏览器只执行含有匹配nonce值的脚本。
  • 使用浏览器提供的js函数如sanitize、escape等对危险输入进行处理。

所以XSS锁作为一道防线,可以有效的防范XSS攻击的发生,提高Web应用程序的安全性。但不能依赖于它来完全避免XSS,仍需要其他安全开发实践的配合。


假设有一个论坛网站forum.com,里面有文章和评论功能。

攻击者 prepare Prepare一个包含恶意代码的评论,例如:<script>// do something evil</script>

攻击者 submit 然后以普通用户的身份,在一篇文章下面提交这个包含恶意代码的评论。

网站没有对评论内容进行过滤,直接存储了这个恶意评论。

之后普通用户Alice访问了这篇文章,浏览器会向forum.com服务器请求文章内容。

服务器将文章页面返回给Alice,其中包括了之前储存的包含恶意代码的评论。

Alice的浏览器在渲染页面时,会执行这个恶意脚本,导致Alice受到攻击。

所以攻击者并没有入侵服务器,只是利用网站自身功能提交了一个含有恶意 payload 的请求。关键在于网站没有过滤就直接在页面嵌入并返回给用户了。


浏览器主要通过以下几种方式来判断script标签中的代码是否为恶意代码:

  1. 检查script标签的来源

浏览器会检查script标签的src属性或者代码内容是否来自当前页面所在的域。如果script标签引用了其他域的资源,则会被判定为不可信代码。

  1. CSP(内容安全策略)

通过CSP可以限制什么样的资源可以加载和执行,什么样的行为是被禁止的。这可以有效防御XSS攻击。

  1. 输入过滤

对用户输入的数据进行过滤,移除可能的XSS payload,只留下安全的内容。

  1. 输出编码

在输出动态内容到页面时,对特殊字符如< >进行编码,防止XSS payload被执行。

  1. HTTP头部

通过设置HTTP头部如X-XSS-Protection等可以启用浏览器自带的XSS防护。

  1. cookies属性

设置cookies的httpOnly属性可以防止JS访问敏感cookies。

综上所述,浏览器主要是通过多层防护来尽量识别和过滤恶意代码,同时让合法的代码可以正常执行。这需要浏览器和服务端共同努力,建立一个良好的安全环境。