【发布时间】:2012-09-16 12:03:40
【问题描述】:
在创建给定 ActiveRecord 模型对象的实例时,我需要生成一个简短的(6-8 个字符)唯一字符串以用作 URL 中的标识符,采用 Instagram 的照片 URL 样式(如 http://instagram.com/p/P541i4ErdL/,我只是争先恐后地成为 404)或 Youtube 的视频 URL(如http://www.youtube.com/watch?v=oHg5SJYRHA0)。
执行此操作的最佳方法是什么?重复create a random string 直到它是唯一的,这是最简单的吗?有没有一种方法可以对整数 id 进行散列/洗牌,这样用户就无法通过更改一个字符来破解 URL(就像我对上面的 404'd Instagram 链接所做的那样)并最终获得新记录?
【问题讨论】:
-
请问您为什么要这样做?随着越来越多的记录被添加,命中模型实例的可能性增加,因为随机字符串非常短,而且很简单,只需要几秒钟即可生成并尝试访问数千个 url。如果你真的想要这种方式的安全性,你将需要一个长字符串。
-
我想在不暴露其数字 ID 的情况下提供资源的永久链接。如有必要,我可以使用更长的字符串,我只是不想使用巨大的哈希值。
-
这是一个很好的问题,您可以在 security.stackexchange.com 上提问。这当然不是为了保护资源(正如你用 Instagram 证明的那样)。散列本身并不安全,我不知道您为什么认为它以任何方式使您的网站安全?现实情况是,您正在使用 8 个字符代码保护可公开访问的资源。任何人所要做的就是生成 8 个字符代码并进行 HEAD 连接,直到他们获得 200 个状态 - 你认为这需要多长时间?如果这是您唯一的保护,那几乎是没有任何保护。
-
这是一个非常好的观点。我将在那里提出一个问题,以了解这一切的原因。
标签: ruby postgresql activerecord sinatra