什么是阻止网站进行xss攻击的好方法

时间:2011-08-10 14:07:03

标签: c# asp.net security webforms xss

我正在使用asp.net 4.0的C#web表单。该网站需要安全,现在正在进行安全审计。我只是想知道需要做些什么来最好地防止XSS攻击到我的网站。

我知道网站的输出可以进行编码。我也从微软看过antixsslibrary.dll,但这似乎已经过时了。 asp.net是否有内置的xss攻击预防?我认为它确实存在,因为我试图在我自己的网站上创建和xss攻击,我得到错误:

  服务器错误。      

从中检测到一个潜在危险的Request.Form值   客户端(ctl00 $ cphListBody $ tbXSS =“alert('XSS V ...”)。   说明:请求验证检测到有潜在危险   客户端输入值,请求的处理已中止。   此值可能表示试图破坏您的安全性   应用程序,例如跨站点脚本攻击。允许页面   覆盖应用程序请求验证设置,设置   httpRuntime配置中的requestValidationMode属性   section to requestValidationMode =“2.0”。示例:。设置此值后,您可以   通过在中设置validateRequest =“false”来禁用请求验证   Page指令或在配置部分。但是,确实如此   强烈建议您的应用程序明确检查所有输入   在这种情况下。有关更多信息,请参阅   http://go.microsoft.com/fwlink/?LinkId=153133

     

异常详细信息:System.Web.HttpRequestValidationException:A   从客户端检测到潜在危险的Request.Form值   (ctl00 $ cphListBody $ tbXSS =“alert('XSS V ...”)。

4 个答案:

答案 0 :(得分:5)

ASP.NET提供的工具允许您防御XSS攻击,但不能自动防御。您需要知道攻击是什么,以及如何使用这些工具来抵御攻击。

您显示的错误是一个默认设置,它会在进入Web应用程序时尝试阻止错误的用户输入。这是一个很好的一步,但如果给你一种虚假的安全感,就不要让它。还有其他方法可能导致错误的输入进入您的数据,从而使您的网站容易受到攻击。

例如,假设您的网站受用户数据驱动。您编写的数据输入屏幕可能会阻止“有潜在危险的内容”,但没有什么可以阻止某人使用其他界面输入数据 - 他们自己的界面,SQL Server Management Studio等。如果他们在那里得到不好的脚本,您的网站将愉快地向用户展示那些危险的脚本。

防止XSS的唯一方法是在将数据输出到浏览器时清理数据,而不是在它进入时。

最基本的方法是使用内置的Server.HtmlEncode()函数来清除来自不受信任来源的所有字符串。 (不受信任意味着除了你自己硬编码的字符串以外的任何东西。数据库,文件和Web服务都不是可靠的来源。)

Server.HtmnlEncode可以做什么限制。我个人喜欢使用Microsoft Anti-Xss library,因为它做得更好(白名单与黑名单过滤)并提供更多功能(如GetSafehtmlFragment())。

网上有大量资源。我从这里开始:

https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet

然后专门针对.NET:

http://msdn.microsoft.com/en-us/library/aa973813.aspx

修改 - 添加

这里的主要问题似乎是对输入过滤和输出过滤之间差异的误解。本文很好地解释了差异,并且比我在这里使用得更好:

http://jeremiahgrossman.blogspot.com/2007/01/input-validation-or-output-filtering.html

最后编辑然后我会停止。

即便是微软也承认我上面所说的话。请参阅此文章:http://msdn.microsoft.com/en-us/library/ms998274.aspx

来自文章:

  

不依赖输入消毒

     

通常的做法是让代码尝试清理输入   过滤掉已知的不安全字符。不要依赖这种方法   因为恶意用户通常可以找到替代手段   绕过验证。相反,您的代码应检查已知   安全,安全的输入。表1显示了代表某些人的各种安全方式   常见的人物。

输入validaiton是你的防御武器库中的一个工具,但仅凭它还不够。

答案 1 :(得分:2)

您可以查看CodePlex上的Microsoft Web Protection Library。您还可以查看XSS page on OWASP以及cheat sheet

答案 2 :(得分:1)

除了之前的答案: 您收到的消息是由ASP.NET的RequestValidation功能生成的。 它试图过滤恶意内容,例如在QueryString中。

虽然这是一个好的开始,但它不够安全,你不再担心脚本攻击。

另请注意,ASP.NET 4.0中默认禁用RequestValidation: http://geekswithblogs.net/bbastiaensen/archive/2010/12/13/request-validation-in-asp.net-4.0.aspx

答案 3 :(得分:0)

就个人而言,我不喜欢RequestValidation功能。基本上,它是猜测用户输入的文本字符串是否有害。你不能指望它捕获每一个可能的攻击字符串。当用户在表单中键入合法值时,这也可能导致错误。

这是问题所在。假设您的网站显示由访问者输入的文本行。

作为恶意用户,我输入<script>window.location='http://www.grossout.com'></script>

如果此文字在下次有人访问您的网站时直接输出到浏览器,则会将其重定向到www.grossout.com。

另一方面,友好的访问者可能会输入This is a cool web site <:-)

下次有人访问您的网站时,由于<字符,他们会收到格式错误的HTML。

在此示例中,最佳解决方案可能是使用Server.HtmlEncode()方法,该方法将转义<字符,以便在不破坏页面的情况下正确显示。

如果您使用的是JavaScript,则可以使用jQuery .text方法来转义<字符。

我认为这两种解决方案都优于使用RequestValidation,因为它们允许显示任何文本而不会导致用户看到错误消息。