2010-09-20 76 views
4

我在需要接受HTML标记输入的表单中有一个文本框。使用HTML编码字符进行ASP.NET请求验证

使用HTML标记提交输入使应用程序抛出HttpRequestValidationException,除非我们使用HttpUtility.HtmlEncode。目前为止很简单。

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

我不明白为什么数字转义代码被认为是潜在的危险,尤其是°作为输入很好。

我似乎被卡住了,因为输入原样由于标记而失败,并且HTML编码输入由于数字转义而失败。我的解决方案到目前为止一直是HTML编码,然后正则表达式用他们的HTML解码格式替换转义序列,但我不知道这是否是一个安全的解决方案,因为我认为转义序列被视为危险的原因。

回答

5

ASP.NET认为html char转义(& #xxx)与其考虑角度括号危险的相同原因(即XSS)是危险的。使用上面的转义,你可以包含任何字符(例如,斜角括号)。请求验证在1.1和2.0中执行的请求的summary

在合法的情况下,如你的情况,你可以为

  • 禁用请求验证的页面 水平(<%@页 validateRequest =你所描述的选择以下任何

    1. 选择自己处理“false”)
    2. 在.NET 4中,使用RequestValidator类替换您自己的请求验证。
  • +0

    当然可以,但为什么是任何容易包括斜角括号,其中'<'比'<'要好,或者只是输入一个<并将它编码为'&lt;'? – jonnystoten 2010-09-20 11:31:55

    0

    我建议寻找在客户端进行有限的html编码,通过绑定处理到表单提交,与jquery相当轻而易举。

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

    你可以运行你通过类似下面的代码JavaScript函数提交的字符串,给你的会通过请求验证的值:

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

    这可能会引起你一些悲痛,如果,存储后它或者用提交的值做一些服务器端的魔法,你想要在输入内重新显示它。让我详细说明一下:如果你只是把一个字符串编码成一个空白段落,它将会完美呈现;但是如果你把它转储到textarea中,你会看到& lt;代替<

    讽刺的是,写的最后一句话我已经当键入&放大器; LT;& lt;分别...

    -2

    只需添加在你的页面指令(该页面的第一行),该属性:

    ValidateRequest = “假”

    +5

    只是一个重要的说明,通过这样做您的页面将容易受到攻击,因此您应该替换跨页脚本的任何不需要的标记。 – 2012-03-06 10:07:00

    +1

    此答案有与之相关的安全风险 – 2012-03-11 00:40:47

    +0

    我知道我说过在我上面的评论中,您是否阅读过它? – 2012-03-11 01:49:36