我的表单中有一个文本框,需要接受带有HTML标记的输入。
使用HTML标记提交输入会使应用投放HttpRequestValidationException
,除非我们使用HttpUtility.HtmlEncode
。很容易到目前为止。
但是,输入也可能包含符号,例如“度”符号(°)。当这些也是HTML编码时,它们将成为数字转义码,在此示例中为°
。这些代码也会导致HttpRequestValidationException
被抛出,但问题是为什么?
我无法理解为什么数字转义码被认为是有潜在危险的,特别是当°
作为输入正常工作时。
我似乎陷入困境,因为由于标签而导致输入失败,并且由于数字转义而导致输入的HTML编码失败。到目前为止,我的解决方案是HTML编码,然后正则表达式用它们的HTML解码形式替换转义序列,但我不确定这是否是一个安全的解决方案,因为我认为转义序列被认为是危险的。< / p>
答案 0 :(得分:5)
ASP.NET认为html char escapes(&amp; #xxx)是危险的,因为它认为角度括号危险,即XSS。使用上面的转义,您可以包含任何字符(例如,有角度的括号)。这是1.1和2.0中请求验证的summary。
在您的案件等合法案件中,您可以选择以下任何一种
答案 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,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g, """);
}
如果在存储它或使用提交的值执行某些服务器端魔术之后,您希望在输入中重新显示它,这可能会让您感到悲伤。让我详细说明一下:如果你只是将一个以这种方式编码的字符串放入一个空段落中,它就会完美呈现;但是如果你将它转储到textarea中,你会看到&amp; lt; 而不是&lt;
具有讽刺意味的是,在写下最后一句话时,我必须分别输入&amp; amp; lt; 和&amp; lt; ...
答案 4 :(得分:-2)
只需添加您的页面指令(页面的第一行)此属性:
ValidateRequest = “假”