编码特殊字符<和>在MVC参数中

时间:2014-08-19 17:25:12

标签: javascript asp.net-mvc-3

我正在尝试在MVC参数中编码<>,尝试使用encodeURIComponent,但是解码似乎在到达控制器之前发生并且它炸毁了路由

public override void RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(
        "Default",
        "Home/{controller}/{action}/{id}",
        new { action = "Index", id = UrlParameter.Optional }
    );
}

http://localhost/HomeStretch/Home/ListAll?Value=%22%7B%3Cdbid%3E%7BD576959C-31F8-469B-9C23-17B046DF590F%7D%3Cdbid%3E%7D%22"

如果我带走<>插入符号,如果我将它们留在通话中失败了。我可以使用*代替%进行自己的愚蠢转换,但是我想知道是否有更好的解决方法?

原来这可能是一个安全问题,我正在搜索事件日志,发现下面的异常已被抛出。如何正确隔离我的标签,这样就不会发生?

Exception information: 
    Exception type: HttpRequestValidationException 
    Exception message: A potentially dangerous Request.QueryString value was detected from the client (Filters[0].Value=""{<dbid>{D576959C-31F8...").
at System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection)
at System.Web.HttpValueCollection.GetValues(String name)

1 个答案:

答案 0 :(得分:2)

重新考虑为什么要以这种格式发送信息。您显示的字符串转换为:

Value="{<dbid>{D576959C-31F8-469B-9C23-17B046DF590F}<dbid>}"

ASP.NET试图保护您免受可能正在尝试注入攻击的黑客的攻击。它看到<dbid>,它认为他们可能正在尝试将HTML发送到您的服务器。

如果你真的需要支持这种输入,那么你可以在你的动作上使用[AllowHtml]来告诉ASP.NET你要特别注意不要在没有正确编码的情况下使用这个输入

但我强烈建议您重新思考为什么要以这种方式发送信息。在我看来dbid=D576959C-31F8-469B-9C23-17B046DF590F可能有用,或者Value={"dbid": "D576959C-31F8-469B-9C23-17B046DF590F"}