2012-02-14 19 views
0

其中一个最普遍的攻击是当今跨站点脚本(XSS),它更多的是对你的应用程序的用户不是在应用程序本身的攻击,但它利用服务器端的应用程序漏洞都是一样的。其结果可能是灾难性的,并可能导致信息泄露,身份欺骗,和特权为什么我应该在.NET为我“做”时手动输入消毒?

阅读this文件我看到消毒服务器端/验证输入之前管理它们的许多建议提升。

嗯,我所知道的,使用存储过程(对于DB侧)和.NET(以管理电子得到的答复)我很肯定。

你能告诉我这样一个场景,存储过程和.NET可能会失败(不消毒/验证),并在那里我可以是“不安全”?

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

回答

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

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

0

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

例如,.NET框架不会知道一个字符串值,将被用作社会安全号码。如果您将此传递给第三方系统(无论是直接传递还是存储在数据库中),然后再传递给第三方系统,则需要清理并验证输入,以检查社会安全号码是否符合预期格式。如果不这样做,可能会使您的系统因第三方系统中的安全漏洞而受到攻击。例如一个包含某些字符的社会安全号码可能会导致第三方系统崩溃,并且这可能会在您的系统尝试与停机的服务进行通信时创建拒绝服务。这种情况只是众多可能性中的一种,它不一定会导致DOS攻击,但最终你会想要验证和消毒输入以防止未知。

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

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

+0

好的答案!那么...... – markzzz 2012-02-15 13:45:09

+0

1 - “如果你将数据传递给标准的.NET Framework对象,那么这些应该处理他们自己的卫生问题”我应该调用哪种类型的句柄?或者你的意思是“它自动调用它自己的卫生工具?” – markzzz 2012-02-15 13:45:42

+0

2 - 是的,我的意思是“肯定”在考虑“请求验证”活动。事实上,将它变成虚假:它是一个很好的功能,我没有看到为什么要禁用它:) – markzzz 2012-02-15 13:46:24

0

通风输入很少是正确的选择。您应该清理或编码它的使用位置,因为只有您知道需要编码,转义或删除的内容。

在大多数情况下,当您使用精心设计的API时,手动消毒不是必需的。但在某些情况下,您仍然需要手动进行编码或验证,因为您知道的不仅仅是API。例如,自动html编码输出不保护你,如果字符串用在嵌入html页面的一段javascript内部。

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

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

相关问题