为什么需要禁用输入验证?

时间:2014-09-09 14:59:02

标签: asp.net asp.net-mvc iis

为什么ASP.NET中的IIS管道要求您选择退出输入验证?据我所知,对于所有其他主要的Web开发框架,您可以在表单中发布您喜欢的任何内容。以默认方式呈现模板时,这些值将自动进行HTML编码,以防止出现安全漏洞。

ASP.NET具有相同的功能。如果我要在特定控制器操作上禁用输入验证,然后使用默认值(不使用Html.Raw)呈现结果,它将自动进行HTML编码。与其他Web框架一样,我可以使用Html.Raw选择退出模板中的自动HTML编码。但是,如果我在包含尖括号的表单中提交值,没有禁用输入验证,则会收到A potentially dangerous value was detected from the client错误。

由于任何形式都可能允许用户使用尖括号等内容,因此默认情况下为什么启用此安全功能?它似乎没有任何帮助,只是通过强制开发人员手动禁用它来阻碍它。

我是否误解了这个问题,或者是否禁用了ASP.NET世界中大多数(如果不是全部)形式的输入验证?

1 个答案:

答案 0 :(得分:4)

请求验证最初是在多年前创建的,当时反射XSS在网络上猖獗。当时ASP.NET团队认为它可以通过拒绝可能包含反射XSS标记的请求来提供良好的内置保护机制来抵御这种攻击。

后见之明是20/20,回想起来这是一个可怕的想法,因为它会让开发人员陷入虚假的安全感。请求验证非常漏洞;它关闭这些做得很差。正如您已经说过的那样,在输出上适当地编码这些值(如我们后面的框架所做的那样)比拒绝输入更为可取。

ASP.NET团队已经正式拒绝请求验证作为一种保护机制,即使有人能够批发它,我们也不会对其进行任何更改。但是我们必须默认启用它,因为应用程序的数量无论好坏依赖它。我们正在考虑在即将到来的更新中更轻松地禁用它的方法。

来源:http://www.asp.net/aspnet/overview/web-development-best-practices/what-not-to-do-in-aspnet,-and-what-to-do-instead#validation