在URL轨道中安全地传递ID参数



我有一个这样的链接: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是正确获得的非常感谢。

最好的方法可能是在用户模型中添加一个额外的列(非null,唯一),该列在用户创建时随机化。

before_create do
  self.uuid = SecureRandom.uuid
end

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

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

实施细节

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

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

您可以添加一个额外的参数,该参数是id的HMAC或数字签名。收件人可以验证id是否没有更改。

最新更新