【问题标题】:how can i hide ID in URL with asp.net MVC4如何使用 asp.net MVC4 在 URL 中隐藏 ID
【发布时间】:2015-08-14 08:19:39
【问题描述】:

我的网址

http://www.domain.com/Products/{别名}-{ID}

还有我的路线

routes.MapRoute(
               name: "ProductDetail",
               url: "Products/{Alias}-{detailId}",
               defaults: new { controller = "Products", action = "ProductDetail", id = UrlParameter.Optional }
            );

在控制器中

public ActionResult ProductDetail(int? detailId)
        {
            var pro = db.Products.Find(detailId);
            if (pro == null)
            {
                return RedirectToAction("Index", "NotFound");
            }
            return View(pro);
        }

现在,我想在我的 URL 中隐藏 ID,例如

http://www.domain.com/Products/{别名}

我该怎么做

【问题讨论】:

  • 隐藏是什么意思?如果不将其添加到 url,则不会在控制器中获取它。
  • 如果Alias 对某个产品来说是唯一的,那么您可以完全删除 id 并使用它,但前提是您确定它是唯一的。如果您解释为什么要隐藏它可能会有所帮助,因为可能还有其他方法可以实现您想要实现的目标
  • @StephenMuecke 如果我不在 URL 中添加 detailID,那么如何在控制器中获取 detailID?
  • @musefan,OP 需要在方法中添加一个参数(它在路由中完全没用)
  • 您不能(除非您的发布表单数据)。 id = UrlParameter.Optional 也有点毫无意义——你没有一个名为 id 的参数。而且你也没有{alias} 的参数

标签: asp.net asp.net-mvc-4


【解决方案1】:

简答

不可能做你想做的事。如果您希望能够从控制器访问 detailId,则必须将 detailId 作为 URL 的一部分传递 - 您无法访问不存在的内容。


长答案

还有其他方法可以绕过用户“隐藏”detailId,以下是一些建议:

1.改用别名:

您可以将detailId 全部删除,并改用Alias 值。但是,这将要求 Alias 值对于您尝试查询的产品是唯一的,并且所需的更改可能如下所示:

routes.MapRoute(
    //..
    url: "Products/{Alias}",
    //..
);

public ActionResult ProductDetail(string Alias)
{
    var pro = db.Products.FindByAlias(Alias);
    //...
}

2。使用 POST 请求:

另一个有效地从 URL 中隐藏 detailId 但仍允许将值传递给控制器​​的解决方案是使用 POST 请求,其中参数值将在 POST 请求正文中指定。

但是,这样做的缺点是您不能简单地提供一个 URL 供用户单击,并且在您的网站中编写链接需要花费更多的精力。通常使用 MVC,POST 请求在提交表单时发生,您也可以使用 javascript ajax 调用进行 POST 请求。

这个答案有点太多了,所以如果你有兴趣,那么做一些研究,比如this question,或者一般是info here

3.加密 detailId 值:

现在此选项不会从 URL 中隐藏 detailId,但如果您担心当前 ID 对用户太友好,那么您可以“加密”(松散地使用)该值。例如,您可以转换为 base64 字符串,然后在控制器中转换回 int。这会给你一个类似这样的 URL:

http://www.domain.com/Products/{Alias}-MQ%3D%3D

此 URL 将 1 表示为 detailId,如果使用此方法,您必须确保 URL encode/decode 您的值。

在这种情况下,Base64 转换并没有真正“加密”它,任何半精明的用户都会注意到这一点并且可以绕过它。但是,如果您想采用这种方法,您可以轻松地使用更安全的 2 路加密算法,只有服务器知道加密/解密密钥。这里的缺点是只有服务器才能为您的用户生成有效的 URL 以“点击”。


此时值得考虑的是,如果您担心 URL 包含一个简单的数字 ID 对用户来说过于友好,那么问题是:您为什么要关心?

如果您担心用户可以简单地更改 detailId 值,然后可以访问他们应该可以访问的产品,那么您的安全性问题就更大了。如果是这种情况,那么您的控制器应该负责验证用户是否可以访问他们尝试访问的产品,然后采取相应的行动。

所有安全检查和验证都应在服务器端处理,切勿依赖您的客户端代码或用户操作来为您完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 2021-01-06
    • 2012-08-15
    • 1970-01-01
    • 2012-06-16
    相关资源
    最近更新 更多