我正在开发一个ASP .Net MVC应用程序。我的一个动作需要 id 作为参数。例如:

public actionresult Detail(Guid id){
    return View();
}

如您所见,我正在使用 Guid 而不是 Int 。问题更具美感。网址可能很长,例如 localhost / Detail / 0c157b42-379d-41d5-b9ba-83e9df9985b2

只接受部分 Guid ,如 localhost / Detail / 0c157b42 是否安全?

有帮助吗?

解决方案

GUID的设计方式应该是唯一的,但它的任何部分都不是。有关详细信息,请参见此博客文章。如果您需要缩短GUID,请使用它 - 例如SHA-1或(如果您没有安全性问题)MD5。

其他提示

不,这不安全。

你可以计算它的SHA-2哈希值,并取其前几个字符。

不,您需要整个GUID,因为子集可能不是唯一的。

例如:

  

0c157b42-379d-41d5-b9ba-83e9df9985b2

     

0c157b42-379d-41d5-b9ba-83e9df9985b3

注意,只有最后一个数字不同。起点都是一样的。您不能使用GUID的尾端,因为无法预测GUID的哪一部分在创建时会发生变化。

其他一些选择 - *如果有多个GUID以0c157b42开头的详细信息,请让URL localhost / Detail / 0c157b42显示适用的详细信息对象列表。 *网址别名 - 允许“友情网址”详细信息对象上的字段。

您可以清除-s的GUID并将HEX转换为Base32(A-Z,0-5),这会将其缩短为16个字符。

有点迟到的反应,但万一有人读到这个......

根据用途,您可以提供缩短的GUID值。

例如,如果生成ID值并将其作为身份验证令牌值赋予用户,则在生成期间您可以使用多个字符并将其与其他使用值进行比较。如果匹配,则只生成一个新的并重新比较,直到其唯一。

如果您修剪GUID的哈希值也是可取的...只是为了安全。事实上,任何时候你随机生成一个值作为ID,那么你应该确保它不是“已经在使用”

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top