为什么我应该在.NET为我“做”时手动输入消毒?

时间:2012-02-14 16:47:41

标签: .net security validation stored-procedures sanitization

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

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

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

你能告诉我一个存储过程和.NET可能失败的情况(没有消毒/验证)以及我可能“不安全”的情况吗?

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

3 个答案:

答案 0 :(得分: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处发现这里很有趣。

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

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

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

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

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

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