1

我正在开发一个 Rails 应用程序,用户无需注册即可添加帖子。我想生成一个随机的唯一密钥并提供一个链接来编辑他们的帖子,例如: http: //mygreatapp.com/post/edit/f7smSDf34Sad。Craigslist 使用了类似的方法。

我的想法是在帖子创建时生成一个随机的、唯一的字符串,并将其与其他帖子数据一起保存在数据库中。然后检查数据库中的字符串是否与请求中的字符串匹配。解决方案安全吗?

你将如何实施它?

编辑:感谢您的回复。但是,生成随机字符串不是问题。数据库中的安全性和实施是我关心的问题。

4

2 回答 2

1

如果我要实现这个,我会使用friendly_id gem,因为你基本上在做的是为你的数据库中的每条记录创建一个独特的slug。friendly_id 默认使用列来创建 slug。您可以告诉friendly_id 使用该id列,然后覆盖他们的normalize_friendly_id方法。

在该方法中,您将生成一个唯一的字符串,然后将其返回。此方法返回的文本是friendly_id 将用于生成您的 slug 的文本。

要生成 slug,您可以简单地使用 MD5 哈希,或者您可以执行以下操作:

(0...50).map{ ('a'..'z').to_a[rand(26)] }.join

使用这种方法而不是简单地自己创建/存储 slug 的好处是您不必这样做Post::find_by_slug(slug),您仍然可以使用Post::find(slug),因为 friendly_id 处理通过 slug 查找记录。

有一集 Railscasts涵盖了friendly_id gem

于 2012-05-31T15:29:43.110 回答
0

我在我的应用程序中使用了类似的东西(to_param 由您的控制器/视图调用以生成路由)

class Post < AR::Base
  def to_param
    Digest::SHA1.hexdigest("--#{self.if}--#{self.created_at}--")
  end
end

唯一的问题是 SHA1 生成长字符串。您可以使用 MD5 代替...

于 2012-05-31T15:34:21.170 回答