使用数据库主键作为URL标识符有哪些优缺点?例如,http://localhost/post/view/13 - 13是我的帖子表的主键。
像reddit这样的网站使用的是我认为的唯一ID,它不是主键,但仍然是唯一有助于识别链接的ID:
http://www.reddit.com/r/funny/comments/7ynin/the_mystery_of_irelands_worst_driver/
只要/ 7ynin /是相同的,您就可以将URL的最后一部分更改为您想要的任何内容。
Digg似乎使用了一个链接标题的标题来标识一个链接:
http://digg.com/space/Liquid_Water_Recently_Seen_on_Mars
如果我没记错的话,默认的WordPress安装使用index.php?p =#作为他们的ID,直到启用了花哨的网址。
我可以看到为什么对于SEO而言,您希望获得最具信息性的网址,但我只是想看看使用主键是安全风险还是仅仅是糟糕的形式。
答案 0 :(得分:14)
您总是希望为用户提供一个不错的网址 - 而不是一些讨厌的自动生成的ID。但我不认为你应该说“友好网址”是主键。您仍然应该使用“经典”自动递增的数字PK,并且第二列是唯一的“友好网址”。为什么呢?
底线:友情网址?见鬼,是的。用它们作为主键?没有。
答案 1 :(得分:2)
它本身并不存在安全风险,但它确实告诉外部实体有关您系统的事情,这通常是一种避免的好习惯。
答案 2 :(得分:2)
正如您所说,将标题直接放在URL中的重点是SEO。在网址中包含关键字会对搜索引擎结果产生重大影响。
然而,还有一些与你的例子有关的想法:
Digg实际上强制执行标题的唯一性(可能只是在特定类别中,我多年没有去过Digg,所以我不记得了)。我曾经常常看到这个有重复故事的故事,其中包含以下网址:
http://digg.com/space/Liquid_Water_Recently_Seen_on_Mars_2
这意味着标题至少是主键的一部分,因为这是确定链接打算针对哪个故事的唯一方法。
使用URL中的主键并没有任何明显的安全风险,除了人们猜测/预测其他人的能力,如pantulis所提到的。但是你不应该依赖“没人会猜这个”作为安全措施。
答案 3 :(得分:2)
如果您不在URL /链接中包含主键,那么您必须制作某种临时合成键,然后,您必须保存映射在用户的会话中的那个键。这会增加更多的状态/内存使用/某些内容以破坏您的应用程序。
如果该值真正敏感,则此可能值得隐藏它的成本。然而,模糊密钥并不能真正使其安全,是吗?在授予对项目的访问权限之前,您需要在任何“控制器”(servlet,代码隐藏,等等)中检查用户角色。
答案 4 :(得分:1)
con:任何访问者都可以轻松尝试猜测其他ID,这可能不是您想要的。
答案 5 :(得分:1)
Reddit也使用数字ID,但使用Base 36进行转换,因此它显示为字符串。它就像十六进制数,实际上也是一个字符串。唯一的区别是基数。
Base 36是“使用ASCII字符的最紧凑的不区分大小写的字母数字系统”,它易于编码和解码。为什么36? A-Z = 26 + 0-9 = 10.