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

Ruby 在URL rails中安全地传递ID参数,ruby,security,url,ruby-on-rails-4,params,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 谢谢大家

我有这样一个链接:
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
谢谢大家!

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

before_create do
  self.uuid = SecureRandom.uuid
end
然后您可以使用
uuid
来识别用户,而不是id

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

实施细节 您的迁移需要有3个部分。首先,您需要向
users
表中添加一个uniq,nullable列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
class Blah000000000
您可以添加一个额外的参数,即id的HMAC或数字签名。收件人可以验证id是否没有更改。

为应用程序提供安全性是徒劳的。您无法安全地编码标识符。这无助于防止重播攻击。此外,链接不能共享。如果你只是想混淆id,那就使用任何散列算法吧。我对这些都不熟悉。是的,我的目标只是确保,当有人手动更改客户id时,不会出现这种情况。你可以使用验证其真实性。嘿,伙计,非常感谢更新!最后一个问题(我假设答案是“否”,但要确保):当我在生产环境中运行此迁移时,它是否会触发我的创建后回调(这是不可取的)?@AndreyDeneko-因为迁移定义了它自己的用户类,所以您的“默认”类将永远不会被加载(因为不会触发常量丢失的钩子)。因此,在此迁移中定义的任何回调都是未定义的—这是处理数据更改迁移的常见模式。