【问题标题】:Encoding special characters < and > in MVC parameters在 MVC 参数中编码特殊字符 < 和 >
【发布时间】:2014-08-19 17:25:12
【问题描述】:

我正在尝试在 MVC 参数中对 &lt;&gt; 进行编码,尝试使用 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"

如果我去掉 &lt;&gt; 插入符号,它会起作用,如果我把它们留在通话中就会失败。我可以使用* 而不是% 进行自己的愚蠢转换,但是我想知道是否有更好的方法来解决这个问题?

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

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)

【问题讨论】:

  • 不完全一样的问题,在这种情况下,问题是特殊字符是路由名称的一部分而不是参数本身,但你是对的,它在同一个区域内。跨度>
  • @Mike Cheel,我想那篇文章的要点是不要相信像 encodeURIComponent 这样的标准函数,请自己编写。
  • 我想知道 encodeUri 是否为你工作了 encodeUriComponent。可能不是我所看到的,但我不知道您的网址来自哪里以及它是如何生成的。

标签: javascript asp.net-mvc-3


【解决方案1】:

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

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

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

如果你真的需要支持这种类型的输入,那么你可以在你的操作中使用[AllowHtml] 告诉 ASP.NET 你会非常小心,不要让这个输入在没有被正确编码的情况下被使用。

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

【讨论】:

  • 原来一位同事在创建这些名称的数据库导入工具中有一个错误。但是你是对的,稍微修改数据以防止风险是最好的。我所做的是首先在该参数上运行 encodeURIComponent,然后将所有 % 替换为 *,这样可以防止翻译。
  • @aggaton:我认为这不是一个合适的解决方案。 ASP.NET 保护您免受的唯一危险是您可能会在脚本上下文(如 HTML)中使用提供的值而没有正确转义它。您描述的解决方法将要求您将 *s 解码回 %s,并为您提供与使用 [AllowHtml] 相同的值,但具有更高的复杂性,并且它仍然会让您拥有相同的潜力安全问题。
猜你喜欢
  • 1970-01-01
  • 2021-09-26
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多