我正在使用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 ...”)。
答案 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,因为它们允许显示任何文本而不会导致用户看到错误消息。