XSSI是XSS的一种形式,即浏览器不会阻止网页加载图像和文本等资源,通常保留在其他领域和服务器上。例如,脚本可以提供攻击者需要的功能,以帮助创建一个特定的页面。然而,当用户访问另一个域名时,它可能被用来从域名中读取用户数据。例如,如果ABC银行有一个脚本来读取用户的私人账户信息,攻击者可以在自己的恶意网站上包含脚本。当ABC银行的客户访问攻击者的网站时,攻击者可以从ABC银行的服务器中提取用户信息。
自20世纪90年代以来,攻击者一直在利用XSS漏洞攻击谷歌雅虎。与大多数应用程序层攻击不同,基于XSS的攻击将攻击应用程序的用户,而不是应用程序或服务器。这些攻击的工作原理是将代码输出到Web应用程序(通常如JavaScript客户端脚本)。大多数网站都有许多注入点,包括搜索域、cokies和表格。虽然这些恶意脚本不能直接感染服务器端信息,但它们仍然可以破坏网站的安全性。通过使用
documentobjectmodel操作来改变表格值,改变网页的外观或切换表格操作,以便将提交的数据张贴到攻击者的网站上。攻击者可以窃取数据,控制用户的会话,使用恶意代码或作为网络钓鱼欺诈的一部分。
开发人员可以部署各种措施来抵御XSSI攻击。其中一种方法是为用户提供一个独特的不可预测的授权令牌,并在服务器响应任何请求之前将该令牌作为额外的HTTP参数发送回去。脚本只能响应POST请求,以防止GET请求中的URL参数被曝光,并防止脚本通过脚本标签加载。浏览器可能会重新发布GET请求,这可能会导致操作执行一次以上,重新发布的POST请求需要用户的同意。
在处理JSON请求时,在响应中加入不可执行的前缀,如
确保脚本不能执行。响应内容可以读取并删除前缀,但其他域名操作的脚本不能读取。此外,开发人员还应避免使用JSONP(具有填充功能的JSON)从不同域名加载机密数据,因为这允许钓鱼网站收集数据。同时,发送响应表头X-content-type-options:nosniff也将帮助保护IE和谷歌Chrome用户免受XSSI攻击。
为了应对XSS攻击,可以在HTPContent-Type响应表头或HTML代码中的HTP-equiv属性中指定CHARSET,这样浏览器就不会解释其他字符集的特殊字符编码。对于使用ASP.NET开发网站的开发者,微软Anti-Crossssssitenglibrary可以帮助保护Web应用程序抵御跨站脚本漏洞。