使用HTML编码字符进行ASP.NET请求验证

时间:2010-09-20 09:30:34

标签: c# asp.net validation

我的表单中有一个文本框,需要接受带有HTML标记的输入。

使用HTML标记提交输入会使应用投放HttpRequestValidationException,除非我们使用HttpUtility.HtmlEncode。很容易到目前为止。

但是,输入也可能包含符号,例如“度”符号(°)。当这些也是HTML编码时,它们将成为数字转义码,在此示例中为°。这些代码也会导致HttpRequestValidationException被抛出,但问题是为什么?

我无法理解为什么数字转义码被认为是有潜在危险的,特别是当°作为输入正常工作时。

我似乎陷入困境,因为由于标签而导致输入失败,并且由于数字转义而导致输入的HTML编码失败。到目前为止,我的解决方案是HTML编码,然后正则表达式用它们的HTML解码形式替换转义序列,但我不确定这是否是一个安全的解决方案,因为我认为转义序列被认为是危险的。< / p>

5 个答案:

答案 0 :(得分:5)

ASP.NET认为html char escapes(&amp; #xxx)是危险的,因为它认为角度括号危险,即XSS。使用上面的转义,您可以包含任何字符(例如,有角度的括号)。这是1.1和2.0中请求验证的summary

在您的案件等合法案件中,您可以选择以下任何一种

  1. 按照您的描述选择自己的处理
  2. 在页面上禁用请求验证 级别(&lt;%@ Page validateRequest = “假”)
  3. 在.NET 4中,使用RequestValidator类替换您自己的请求验证。

答案 1 :(得分:2)

这是由于ASP.NET内置Cross Site Scripting验证功能。 ASP.NET上有一些允许和不允许的内容列表,这里是SO:ASP.NET request validation causes: is there a list?

关于#编码字符的特定情况,这里有一个完整的XSS攻击参考:XSS (Cross Site Scripting) Cheat Sheet,它证明了这些攻击的复杂程度,以及禁止编码字符的原因。

答案 2 :(得分:0)

您可以在msdn帮助中阅读Script Exploits Overview

如果您确定在页面中处理了任何可能的恶意代码输入,那么您可以disable validation使用&lt;%@ Page validateRequest =“false”%&gt;指令。

答案 3 :(得分:0)

我建议在客户端进行有限的html编码,通过将处理绑定到表单提交,可以轻松地使用jquery。

“有限”是什么意思?应该编码“&”字,角度括号和引号,但不能编码unicode符号。你指出,事实上,数字转义码是邪恶的并且被拒绝了,不像它们未转义的等价物!

您可以通过类似于以下代码的javascript函数运行您提交的字符串,为您提供一个可以通过请求验证的值:

function safeString(s) {
    return s.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g, "&quot;");
}

如果在存储它或使用提交的值执行某些服务器端魔术之后,您希望在输入中重新显示它,这可能会让您感到悲伤。让我详细说明一下:如果你只是将一个以这种方式编码的字符串放入一个空段落中,它就会完美呈现;但是如果你将它转储到textarea中,你会看到&amp; lt; 而不是&lt;

具有讽刺意味的是,在写下最后一句话时,我必须分别输入&amp; amp; lt; &amp; lt; ...

答案 4 :(得分:-2)

只需添加您的页面指令(页面的第一行)此属性:

  

ValidateRequest = “假”