【问题标题】:What is a good way to prevent websites from xss attacks有什么好办法可以防止网站受到xss攻击
【发布时间】:2011-08-10 14:07:03
【问题描述】:

我正在使用带有 asp.net 4.0 的 C# Web 表单。该网站需要安全,现在正在通过安全审核。我只是想知道需要做什么才能最好地防止对我的网站的 XSS 攻击。

我知道网站的输出有可用的编码。我还研究了微软的antixsslibrary.dll,但这对我来说似乎已经过时了。 asp.net 是否有任何内置的防止 xss 攻击的功能?我被引导认为它确实如此,因为我试图在我自己的网站上创建和 xss 攻击并且我收到错误:

“/GNB.DPS.MVAD.Presentation.Web”应用程序中的服务器错误。

从 客户端 (ctl00$cphListBody$tbXSS="alert('XSS V...")。 说明:请求验证检测到潜在危险 客户端输入值,并且请求的处理已中止。 此值可能表示试图危害您的安全 应用程序,例如跨站点脚本攻击。允许页面 覆盖应用程序请求验证设置,设置 httpRuntime 配置中的 requestValidationMode 属性 requestValidationMode="2.0" 部分。例子: 。设置此值后,您可以 通过在 页面指​​令或在配置部分。然而,它是 强烈建议您的应用程序明确检查所有输入 在这种情况下。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=153133

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

【问题讨论】:

    标签: c# asp.net security webforms xss


    【解决方案1】:

    ASP.NET 提供了一些工具,可以让您防御 XSS 攻击,但不能自动防御。您需要知道攻击是什么,以及如何使用工具来防御它们。

    您显示的错误是一个默认设置,它试图阻止错误的用户输入进入网络应用程序。这是一个不错的步骤,但不要让您产生虚假的安全感。错误输入还有其他方法可以进入您的数据,从而使您的网站易受攻击。

    例如,假设您的网站是由用户数据驱动的。您编写的数据输入屏幕可能会阻止“潜在危险内容”,但没有什么可以阻止某人使用其他界面输入数据 - 他们自己的界面、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 显示了表示一些安全的各种安全方法 常用字符。

    输入验证是您的防御武器库中的一种工具,但仅此还不够。

    【讨论】:

    • 什么是 XSS 攻击的例子可以克服这个错误?
    • 我没有在您的文本框中输入输入,而是通过我自己的应用程序访问您的数据库并通过我的界面输入恶意脚本。下次从数据库中检索数据库输入时,它会在您的界面中显示给用户。
    • 关键是,除了过滤来自用户的输入之外,您绝对必须在将数据输出给用户时对其进行过滤。它们是两个不同的信任边界,您需要同时保护它们。
    【解决方案2】:

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

    【讨论】:

    • +1 用于 WPL,因为它使用白名单而不是黑名单。
    【解决方案3】:

    除了前面的答案: 您收到的消息是由 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

    【讨论】:

      【解决方案4】:

      就我个人而言,我不喜欢 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,因为它们允许显示任何文本而不会导致用户看到错误消息。

      【讨论】:

      • 我也不喜欢 RequestValidation,但这并不能解决 XSS 问题。
      猜你喜欢
      • 2021-01-02
      • 2023-04-06
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-11
      相关资源
      最近更新 更多