在URL rails中安全地传递ID参数

时间:2014-09-30 09:46:38

标签: ruby security url ruby-on-rails-4 params

我有这样的链接:http://www.somesite.com/s/bkucoj?i=#{@client.id}。 我如何确保客户端的ID将被安全传递(散列/加密),而不仅仅是裸号码?

所以我们的目标是得到类似的东西:

http://www.somesite.com/s/bkucoj?i=f1nSbd3bH34ghfAh12lcvzD

而不是

http://www.somesite.com/s/bkucoj?i=12

我怎样才能实现它?

还有什么,我还想确保,另一方面,客户端ID已正确获取 谢谢!

2 个答案:

答案 0 :(得分:1)

执行此操作的最佳方法可能是在用户模型中添加一个额外的列(非空,唯一),该模型在用户创建时随机化。

before_create do
  self.uuid = SecureRandom.uuid
end

然后,您可以使用uuid来识别用户而不是ID。

当然,您需要在添加此列时修改所有现有用户。

实施细节

您的迁移需要有3个部分。首先,您需要向users表添加uniq,可空列uuid。然后,您需要遍历现有客户并填充此列。之后,您可以使列不可为空。它很可能看起来像这样:

class Blah000000000 < ActiveRecord::Migration
  class User < ActiveRecord::Base
    before_save { self.uuid ||= SecureRandom.uuid }
  end

  def up
    add_column :users, :uuid, :string, unique: true
    User.all.each &:save!
    change_column :user, :uuid, string, unique: true, null: false
  end

  def down
    remove_column :users, :uuid
  end
end

答案 1 :(得分:1)

您可以添加额外的参数,即ID的HMAC或数字签名。收件人可以验证ID未更改。