【问题标题】:URL encoded params handling with ASP.NET MVC使用 ASP.NET MVC 处理 URL 编码的参数
【发布时间】:2012-02-06 03:36:00
【问题描述】:

我的 MVC Web 应用程序生成一个可以包含任何字符(%、+、/ 等)的激活链接。我对字符串进行 URL 编码并生成链接:

new UrlHelper(HttpContext.Current.Request.RequestContext)
       .RouteUrl("AccountActivation", 
                 new { id = HttpContext.Current.Server.UrlEncode(activationString) };

然后添加域,它看起来像:

 http://localhost/AccountActivation/asdlkj223%25asd%2Basw3fgasdme

然后将 URL 传递给用户。

这种情况下的路线是:

 routes.MapRoute(
            "ActivateAccount",
            "AccountActivation/{id}",
            new { controller = "Account", action = "Activate", id = ""});     

对我来说似乎很好,但是 ASP.NET 开发服务器和 IIS 给了我 HTTP 错误 400 - 错误请求。这意味着我无法看到的 URL 有问题。

当去掉路由描述中的 {id} 时(我也试过 {*id} 没有成功):

  routes.MapRoute(
            "ActivateAccount",
            "AccountActivation",
            new { controller = "Account", action = "Activate"});

网址如下所示:

http://AccountActivation?id=asdlkj223%25asd%2Basw3fgasdme

它们工作得很好......

尽管这两种方法做的事情完全相同。它们之间有什么区别?是 MVC 引擎为我执行了更多操作,还是我错过了 URL 编码的某些内容。

【问题讨论】:

  • 您的激活操作是什么样的?日志中是否有任何异常可以提供有关基础错误的更多信息?

标签: asp.net-mvc asp.net-mvc-3 urlencode


【解决方案1】:

尝试UrlPathEncode 而不是UrlEncode - 路径中的某些字符是非法的,而在查询字符串中是合法的。

也就是说 - 我相信在路径解码发生后执行字符是否“坏”的分析;并由 IIS 完成。它会拒绝某些字符,因为 URL 可能会映射到物理文件系统,因此 可能 允许用户访问他们实际上不应该访问的内容。同样,这样做是为了防止请求发送真正不应该发送的数据。

一般来说,如果将参数映射为路由参数在操作上没有任何好处,那么不要太努力地映射它 - 特别是在字符串可以是任何东西的情况下。

顺便说一句——如果那是二进制数据的编码;您可以考虑对其进行十六进制编码或改用modified base-64 for URLs - 如果映射为路由参数,则不会导致错误。

【讨论】:

    猜你喜欢
    • 2010-09-19
    • 2011-01-08
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2019-01-19
    • 1970-01-01
    • 2012-01-01
    相关资源
    最近更新 更多