security - 使用主键/ID 字段作为 URL 中的标识符

标签 security database-design friendly-url

使用数据库主键作为 URL 标识符的优缺点是什么?例如,http://localhost/post/view/13 - 13 是我的帖子表的主键。

一些像 reddit 这样的网站使用我认为是唯一的 id,它不是主键但仍然是唯一的来帮助识别链接:

http://www.reddit.com/r/funny/comments/7ynin/the_mystery_of_irelands_worst_driver/

只要/7ynin/相同,您就可以将 URL 的最后一部分更改为您想要的任何内容。

Digg 似乎使用链接标题的 slug 来标识链接:

http://digg.com/space/Liquid_Water_Recently_Seen_on_Mars

如果我没记错的话,默认的 WordPress 安装使用 index.php?p=# 作为他们的 id,直到启用花哨的 url。

我可以理解为什么为了 SEO 的缘故,您希望拥有尽可能多的信息性网址,但我只是想看看使用主键是否存在安全风险,或者只是形式不佳。

最佳答案

您总是希望向用户提供一个不错的 URL——而不是一些讨厌的自动生成的 ID。但我认为您不应该将所说的“友好网址”作为主键。您仍然应该使用“经典”自动递增的数字 PK,并有第二列是唯一的“友好 url”。为什么?

  • 所有评论表,评分
    表,任何有
    与您的内容表的关系
    可以使用数字主键。
    这意味着更小的索引和更低的
    内存使用。
  • 有人会想要
    更改友好网址。如果你有
    有一个数字主键,你没有
    必须更新您的任何受抚养人
    表(或让数据库通过
    级联更新)。
  • 在将来,
    你可以抽象出 URL 位
    进入另一张 table 。说表可以
    然后存储“传统” URL 映射
    该问题重定向到主要
    “真实”网址映射。那么当用户
    想要更改友好 URL,
    你不必打破所有
    入站旧 URL。做不到
    如果您的主键是
    “友好网址”。
  • 我仍然倾向于在我所有的 AJAX goo 中使用数字主键(例如,post_new_comment() javascript 函数将采用主键,而不是一些友好的 URL)。我唯一一次使用友好 URL 是在任何面向用户的 URL 结构中。
  • 至于安全?如果您的内容受到访问控制,则无论是主键还是一些友好的 URL,您都必须检查访问权限。
  • 如果您允许通过主键访问内容,人们可能会尝试插入随机 ID。如果您不仅要求限制访问内容,而且要求否认所述内容,这就是您的错误措辞的问题。这与登录失败相同——您不会说“找不到用户名”,而是说“用户名或密码错误”。插入随机值以查找内容对于您采用的任何方法都是一个问题,只是使用数字键可以尝试的值要少得多。

  • 底线:友好的网址? hell 是的。使用它们作为主键?一定不行。

    关于security - 使用主键/ID 字段作为 URL 中的标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/566996/

    相关文章:

    mysql - 创建排名表的正确方法?

    mysql - 用户和组 : 3 or 2 tables (SQL)

    seo - 网址中的特殊字符

    php - 如何构建一个列表过滤干净的 url 以提高可用性和 SEO?

    security - Zend 形式的随机数

    php - 通过 Ajax 进行 Restful 身份验证

    java - 如何使用 JAXB 防止 XML 实体注入(inject)

    database-design - 使用自然键,或使用代理键和审计表来审计/更改日志

    seo - 动态网址 + 搜索引擎优化

    php - 垃圾邮件发送者使用相同的自动增量 ID 再次注册