如果为站点启用了ASP.NET请求验证,您是否仍需要在简单表单(例如ASP文本框)中使用HtmlEncode和HtmlDecode字符串信息?
如果为站点启用了ASP.NET请求验证,您是否仍需要HtmlEncode
ASP.NET请求验证是一个试图解决愚蠢作者的破坏程序的黑客攻击.不要写破坏的程序.
您写入HTML页面的任何文本字符串都必须是HTML编码的; 这是正确性的问题,而不仅仅是安全性(这是正确性的一个子集).即使请求验证可以神奇地消除任何可能的XSS攻击(这是如此不一样的情况下),遇事的HTMLEncode文本输出仍然会使您打开生产畸形的输出,破坏您的数据.说我正在讨论一些变量的论坛帖子a
,b
并且c
想说:
ac b>a
如果这与未编码的HTML源代码相呼应,我会得到:
a c b> a
也许页面的其余部分也会很大胆.哎呦!
请求验证是虚假的,不应该依赖.默认情况下启用并"推荐用于所有生产环境"是令人遗憾的,这让我非常怀疑ASP.NET团队的理智.
如果你已经正确地编写了程序,那么你就不需要它了,它只会妨碍你.(例如,如果SO使用它,我将无法提及提及标记的帖子.)如果您没有正确编写程序,请求验证不会修复您的安全漏洞,它只是去使它们更加模糊.
和HtmlDecode字符串信息
您通常不会在Web应用程序中对任何内容进行HtmlDecode.您编码将内容推送到HTML中,但是当内容从提交的表单返回时,它是纯文本,而不是HTML编码.
来自简单形式(例如ASP文本框)?
文本框应该没问题; 设置他们.Text
做的任何必要的编码,使你出现在文本框中的确切字符串.但.有些事情看起来应该是自动进行HTML编码实际上并非如此.例如:
myTextBox.Text= "ac"; // Fine! myLabel.Text= "ac"; // Broken!
噢亲爱的.Text
并不总是意味着文本.有时,它实际上意味着HTML.谢谢微软,这个话题让人讨厌,太多人已经发现很难理解.
无论是否打开请求验证,ASP.NET文本框中的文本都没有危险.文本框控件在文本框中显示时自动对数据进行编码.
在其他地方输出源自用户的数据时,HTML(或JavaScript)对该数据进行编码非常重要.ASP.NET的请求验证仅提供最低级别的保护.它不是不可穿透的,甚至是接近它.它仅用于防御最简单的攻击.
当您在网站的其他部分输出内容时,仍然需要对内容进行编码.
编辑
其他地方我的意思是,如果用户将数据输入文本框,使用ASP.NET文本框控件是安全的,因为控件会自动对输出进行编码,以便安全地呈现.
比如说,您正在使用StackOverflow的用户信息页面.当用户选择其用户名时,他们可以选择输入在您网站的其他部分输出时可能是恶意的内容.例如,我的StackOverflow登录名显示在每个页面的顶部,也列在"用户"页面上.
在"用户"页面上,AJAX用于加载用户.当JavaScript用于评估用户名时,它不受与HTML标记相同的编码规则的约束,因此我可以在用户名文本框中键入一些内容,当它在用户列表中输出时可能会导致某些中断行为.
StackOverflow显然在发送给客户端时正确编码用户数据,因此它们是安全的.在将我的用户名发送到客户端之前,他们(可能)有一些JavaScript编码例程,以确保我的用户名在JavaScript代码中执行时不会变成恶意.
如果在非ASP.NET输入控件中使用它,也可能会遇到问题.输入标记使用属性来定义内容,因此您可以轻松输入将通过请求验证检查但可能允许用户添加恶意"鼠标悬停"属性的文本.