Language agnostic 通常,在URL中总是散列唯一标识符是个好主意吗?

Language agnostic 通常,在URL中总是散列唯一标识符是个好主意吗?,language-agnostic,url,Language Agnostic,Url,大多数使用自动递增主键的站点在url中公开显示它 i、 e example.org/?id=5 这使得任何人都可以很容易地抓取一个站点并通过简单地增加id值来收集所有信息。我可以理解,在某些情况下,如果权限/身份验证设置不正确,这是一件坏事,任何人都可以通过猜测id来查看任何内容,但这是一件好事吗 example.org/?id=e4da3b7fbbce2345d7772b0674a318d5 是否曾经有过这样的情况:散列id以防止爬行是一种糟糕的做法(除了浪费设置此功能所需的时间之外)?或者这

大多数使用自动递增主键的站点在url中公开显示它

i、 e

example.org/?id=5

这使得任何人都可以很容易地抓取一个站点并通过简单地增加id值来收集所有信息。我可以理解,在某些情况下,如果权限/身份验证设置不正确,这是一件坏事,任何人都可以通过猜测id来查看任何内容,但这是一件好事吗

example.org/?id=e4da3b7fbbce2345d7772b0674a318d5


是否曾经有过这样的情况:散列id以防止爬行是一种糟糕的做法(除了浪费设置此功能所需的时间之外)?或者这都是一个没有实际意义的话题,因为通过在网络上发布一些东西,你会承担被窃取/挖掘的风险吗?

我认为对公开访问的id进行哈希不是一件坏事,但在某些情况下显示顺序id将是一件坏事。更好的是,对所有ID使用GUID/UUID。您甚至可以在许多技术中使用顺序GUID,因此速度更快(插入阶段)(虽然在分布式环境中没有那么好)

在ID上使用类似MD5或SHA的散列不是一个好主意:

  • 碰撞的可能性总是存在的。也就是说,两个不同的id散列到相同的值
  • 你打算如何将其解卷回实际ID
如果要避免增加ID,更好的方法是使用GUID,或者在创建ID时使用随机值


也就是说,如果您的应用程序安全性依赖于人们不猜测ID,那么系统中的其他地方就会出现一些缺陷。我的建议是:坚持简单易用的自动递增ID,并应用一些适当的访问控制。

我的意见是,如果某个东西在web上,并且在不需要授权的情况下提供,那么它的目的是让公众可以访问。积极尝试使访问变得更加困难似乎是违反直觉的。

如果我显示的内容必须显示在URL中,并且需要凭据才能访问,或者是特定用户所独有的(如订单id),我的一般规则是使用GUID<代码>http://site.com/orders?id=e4da3b7fbbce2345d7772b0674a318d5

这样,另一个用户就无法通过破解url来“窥视”下一个订单。他们可能被拒绝访问其他人的订单,但向他们投掷无数字母和数字是一种非常明确的表达“不要搞砸这件事”的方式

如果我显示的内容是公共的,并且与特定用户无关,那么我可以使用整数键。例如,为了显示图片,您可能希望允许您的用户破解url以查看下一张图片

http://example.org/pictures?id=4
http://example.org/pictures?id=5


(实际上,作为一个简单的GET参数,我不会这样做,我会使用mod_rewrite(或其他)来创建可读的URLhttp://example.org/pictures/4->
/pictures.php?picture\u id=4
,等等)

散列整数是一种模糊的安全实现,因此如果这是目标,那么就需要一个真正的GUID甚至一个“顺序”GUID(无论是通过NEWSEQUENTIALID()还是通过COMB算法)要好得多


不管是哪种方式,都没有人再键入URL了,所以我觉得担心长度的差异没有多大意义。

通常,对站点进行爬网是一件好事。如果您希望尽可能多地获得您的信息,您希望像谷歌这样的站点在您的站点上收集数据,以便其他人可以找到它

如果您不希望人们浏览您的站点,请使用身份验证,并拒绝没有访问权限的人访问


随机查找的URL只会给人一种安全感的印象,而不会给人真实感在URL中,每个人都可以访问该网络蜘蛛的帐户。

一般来说,对于网站,您试图使其易于抓取并访问所有信息,以便获得良好的搜索排名并提高网站的访问量。优秀的web开发人员在设计HTML时考虑到搜索引擎,并且通常还提供创建RSS提要和站点地图,使内容更易于抓取。因此,如果您试图通过不使用顺序标识符来增加抓取的难度,那么(a)您并没有增加抓取的难度,因为抓取程序通过以下链接工作,而不是猜测URL,以及(b)你试图让事情变得更难,而你也花时间试图让事情变得更容易,这毫无意义

如果您需要安全性,则使用实际的安全性。使用主体检查来授权或拒绝对资源的访问。混淆URL根本不安全


因此,我认为使用数字标识符或试图混淆它们时的任何值都没有问题。

当您不希望URL可遍历时,对标识符或其他URL组件进行哈希或随机化可能是一种很好的做法。这不是安全性,但会阻止使用(或滥用)通过爬虫获取您的服务器资源,并可以帮助您确定何时发生这种情况

一般来说,您不希望公开应用程序状态,例如将来将分配哪些ID,因为它可能允许攻击者以您没有看到的方式使用预测。例如,BIND的顺序事务ID是一个错误

如果您确实希望鼓励爬网或其他遍历,则更严格的方法是提供链接,而不是提供将来可能更改的实现细节


使用顺序整数作为ID可以使您的许多事情变得更便宜,这可能是一个合理的折衷办法。

是的,使用MD5作为整数ID与使用整数ID是一样的,因为两者之间有很好的一对一对应关系。一个有足够动机的用户可以提出彩虹表()并使用MD5s而不是整数来破解您的url