【问题标题】:Why I should Sanitizing manually input when .NET "do it" for me?当 .NET 为我“做”时,为什么我应该手动输入消毒?
【发布时间】:2012-03-06 01:11:14
【问题描述】:

当今最流行的攻击之一是跨站点脚本 (XSS),它更多地是针对应用程序用户的攻击,而不是针对应用程序本身的攻击,但它同样利用服务器端应用程序漏洞。结果可能是毁灭性的,并可能导致信息泄露、身份欺骗和特权提升

阅读this 文档,我在管理它们之前看到了许多关于服务器端清理/验证输入的建议。

嗯,据我所知,使用存储过程(用于数据库端)和 .NET(管理 e 获取响应)我很确定。

您能否向我展示一个存储过程和 .NET 都可能失败(没有清理/验证)以及我可能“不安全”的场景?

正如我所说,我的意思是“安全性”,而不是数据的持久性/准确性!我同意清理输入...

【问题讨论】:

    标签: .net security validation stored-procedures sanitization


    【解决方案1】:

    我知道我的答案引用了 java,但我觉得它至少会提供一些上下文(另一个原因响应很重要)为什么我们还需要服务器/客户端输入卫生。

    来自您引用的文档:

    String Fields
    
    To validate string fields, such as names, addresses, tax identification numbers, and so on, use regular expressions to do the following:
    
        Constrain the acceptable range of input characters.
        Apply formatting rules. For example, pattern-based fields, such as tax identification numbers, ZIP codes, or postal codes, require specific patterns of input characters.
        Check lengths.
    

    如果您没有在客户端/服务器端限制/验证此字符串/类型的长度,老练的攻击者可能会通过提供长字符串输入来破坏您的系统。确实这是 Java 中的一个问题(不确定它是否适用于 .NET/IIS,假设是因为 .NET 使用哈希码来表示相等,我也可能是错的)。

    这很有趣,我们几天前在这里SO

    如果您可以将字符串大小限制为限制字符。您可以安全地避免这些问题。

    【讨论】:

      【解决方案2】:

      如果您将数据传递给标准 .NET Framework 对象,那么这些对象应自行处理。您应该将需要清理的数据视为 .NET 不知道如何处理的所有数据。即 .NET 框架不知道其用途的数据。

      例如,.NET 框架将不知道将字符串值用作社会保险号。如果您将其传递给第 3 方系统,直接或存储在数据库中,然后在稍后传递,您将需要清理和验证输入以检查社会安全号码是否在预期中格式。如果不这样做,您的系统可能会因为第 3 方系统中的安全漏洞而容易受到攻击。例如输入的社会安全号码包含某些字符可能会导致第 3 方系统崩溃,进而可能会在您的系统尝试与已关闭的服务通信时造成拒绝服务。这种情况只是众多可能性之一,它不一定会导致 DOS 攻击,但最终您需要验证和清理输入以防范未知数。

      正如您特别提到的 XSS,这是一个标准 .NET Web 控件实际上容易受到攻击的漏洞,除非请求验证的默认选项处于活动状态(请参阅http://www.asp.net/whitepapers/request-validation)。这是因为 .NET Web 控件在设置 Text 属性时不会自动对字符进行 HTML 编码。因此,如果您在没有请求验证的情况下运行您的站点,您应该确保所有输出都正确编码(这是一种输出清理形式)。考虑到我会选择使用 MVC 框架而不是 Web 表单进行开发,因为它可以很容易地使用 HTML 输出清理(例如,使用 括号将自动对输出进行 HTML 编码)。这使您的应用程序能够正确处理在输入中输入的恶意(和非恶意)<script> 标签,而无需验证,因为输出已正确清理,因此如果您的应用程序以这种方式受到保护,则可以禁用请求验证,即我的首选选项,因为您不会不必要地操纵用户输入。例如,如果 SO 净化输入并删除 <script> 标记,我将无法将它们包含在此消息中。

      Web 应用程序中常见的另一种清理类型是正确格式化将注入 JavaScript 的字符串(例如单引号和双引号字符)。简而言之,您要防止用户通过输入插入恶意 JavaScript,如果未正确清理,该输入将显示给另一个用户并执行,并且在执行时请求将以可能具有更高安全级别的新用户身份运行在应用程序中,可能会发生各种损坏。

      【讨论】:

      • 1 - “如果您将数据传递给标准 .NET Framework 对象,那么这些对象应该自己处理”我应该调用哪种句柄?或者你的意思是“它会自动调用自己的清洁工具?
      • 2 - 是的,我的意思是“确定”考虑“请求验证”处于活动状态。实际上将其设置为 false 会很奇怪:它是一个不错的功能,我不明白为什么要禁用它:)
      • 3 - 老实说,我不知道 .NET 上的 MVC,总是使用 Web 表单。但我也知道在 .cs 上,.NET 自动编码字段,当字符串已经编码时也是如此(我讨厌;关注这篇文章 stackoverflow.com/questions/9035736/…
      • 4 - 我认为 .NET 管理单引号和双引号...正确转义它们。暂时没有发现这个问题! (我的意思是,如果我在表单上插入字符串Hello my name "is" Marco,并且在我做出console.log("<%=string%>") 的响应中它不会被破坏!所以转义由.NET 自动管理)
      • @markzzz 为什么要启用“请求验证”?对我来说,这似乎是一个被误导的功能。它在错误的地方,并且对上下文的了解不足以可靠地保护您,并且会导致误报。
      【解决方案3】:

      净化输入很少是正确的选择。您应该在使用它的地方进行清理或编码,因为只有在那里您才知道需要编码、转义或删除的内容。

      在大多数情况下,当您使用设计良好的 API 时,不需要手动清理。但在某些情况下,您仍然需要手动编码或验证,因为您知道的不仅仅是 API。例如,如果字符串用于嵌入在 html 页面中的一段 javascript 中,则自动 html 编码输出不会保护您。

      <script>var text="@Model.UserControlledData";</script>
      

      自动编码规则适合 html,而不是 javascript 字符串,所以这是不安全的。

      【讨论】:

        猜你喜欢
        • 2017-04-26
        • 2018-11-30
        • 2019-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-06
        • 1970-01-01
        相关资源
        最近更新 更多