为什么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世界中大多数(如果不是全部)形式的输入验证?
答案 0 :(得分:4)
请求验证最初是在多年前创建的,当时反射XSS在网络上猖獗。当时ASP.NET团队认为它可以通过拒绝可能包含反射XSS标记的请求来提供良好的内置保护机制来抵御这种攻击。
后见之明是20/20,回想起来这是一个可怕的想法,因为它会让开发人员陷入虚假的安全感。请求验证非常漏洞;它关闭这些做得很差。正如您已经说过的那样,在输出上适当地编码这些值(如我们后面的框架所做的那样)比拒绝输入更为可取。ASP.NET团队已经正式拒绝请求验证作为一种保护机制,即使有人能够批发它,我们也不会对其进行任何更改。但是我们必须默认启用它,因为应用程序的数量无论好坏依赖它。我们正在考虑在即将到来的更新中更轻松地禁用它的方法。