XSS攻击(跨站脚本攻击)的概念:
用户通过网站页面的输入框植入自己的脚本代码,来获取额外的信息。
XSS的实现方式:
(1)通过用户将恶意的脚本命令输入到网站中,而这些网站又能够接收“不干净”用户输入,称为“被动注入”,用户把“不干净”的内容输入到文本框中,并把这些内容保存到数据库中,以后再重新在页面上显示。
(2)通过直接在页面上显示的用户输入,称为“主动注入”。用户将“不干净”的内容输入到文本框中,这些输入的内容立刻就会在屏幕上显示出来。
阻止XSS攻击:
(1)Html编码
大部分情况下,使用简单的HTML编码就可以避免XSS -- 服务器通过这个过程将HTML保留字符(如 “<” 和 “>” )替换为特殊编码。对于ASP.NET MVC而言,只需要在视图中使用Html.Encode和Html.AttributeEncode方法就可以实现对特性值的“编码”替换。
谨记:永远不要信任用户能够接触到的或者使用的一切数据,其中包括所有的表单值、Url、cookie或来自第三方源(如OpenID)的个人信息。此外,网站所访问的数据库或服务可能没有对这些数据进行编码,所以不要相信输入应用程序的任何数据,要尽可能地对它们进行编码。
(2)JavaScript编码
Html编码不能阻止注入的JavaScript执行。
解决方法: (1)使用Ajax.JavaScriptStringEncode辅助方法对JavaScript中使用的字符串进行编码,这与Html.Encode方法进行编码是类似的
(2)使用AntiXSS库
AntiXSS库可以为ASP.NET应用程序增加一层额外的防护,它的工作机制与ASP.NET和ASP.NET MVC的编码机制相比有几点重要差异,主要是如下两点:
(1)AntiXSS使用一个新人字符的白名单,而ASP.NET的默认实现使用一个有限的不信任字符的黑名单。AntiXSS只允许已知安全的输入,因此它只提供安全性能要炒锅视图组织潜在有害输入的过滤器。
(2)AntiXSS库的中点是组织应用程序中的安全漏洞,而ASP.NET编码主要关注防止HTML页面的显示不被破坏。
要使用AntiXSS库,只需要在web.config的httpRuntime中添加如下代码:
<httpRuntime encoderType="System.Web.Security.AntiXss.AntiXssEncoder,System.Web, Version=4.0.0.0,Culture=neutral, PublishKeyToken=b03f5f7f11d50a3a" />
或者安装AntiXSS NuGet包。在视图中添加对Microsoft.Security.Application命名空间的引用,然后再使用Encoder.JavaScriptEncode()方法来编码。