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-因为迁移定义了它自己的用户类,所以您的“默认”类将永远不会被加载(因为不会触发常量丢失的钩子)。因此,在此迁移中定义的任何回调都是未定义的—这是处理数据更改迁移的常见模式。