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标签中的代码是否为恶意代码:
- 检查script标签的来源
浏览器会检查script标签的src属性或者代码内容是否来自当前页面所在的域。如果script标签引用了其他域的资源,则会被判定为不可信代码。
- CSP(内容安全策略)
通过CSP可以限制什么样的资源可以加载和执行,什么样的行为是被禁止的。这可以有效防御XSS攻击。
- 输入过滤
对用户输入的数据进行过滤,移除可能的XSS payload,只留下安全的内容。
- 输出编码
在输出动态内容到页面时,对特殊字符如< >进行编码,防止XSS payload被执行。
- HTTP头部
通过设置HTTP头部如X-XSS-Protection等可以启用浏览器自带的XSS防护。
- cookies属性
设置cookies的httpOnly属性可以防止JS访问敏感cookies。
综上所述,浏览器主要是通过多层防护来尽量识别和过滤恶意代码,同时让合法的代码可以正常执行。这需要浏览器和服务端共同努力,建立一个良好的安全环境。