存储参数的正确方法?

时间:2014-10-04 15:27:12

标签: ruby-on-rails ruby-on-rails-4

目前,我将user_id存储在会话中:

session[:user_id] = user.id

稍后,当用户点击特定外部链接并将其保存到数据库时,我会检索数据。

def offer_params
  params.permit(:offer_id).merge(user_id: session[:user_id])
end

这是在多个视图上存储参数的正确方法吗?用户不能更改此保存吗?

并且:有其他方法可以做到这一点吗?

1 个答案:

答案 0 :(得分:2)

这肯定有效,但你可以改进它。 user_id不是您想直接让用户控制的东西。特别是如果您的应用是新的并且您的用户ID是连续的,那么有人可以很容易地操纵这个数字并查看其他帐户。

一种解决方案是在用户记录中创建一个名为" token"的字符串字段。在此字段上添加索引。

class AddTokenToUsers < ActiveRecord::Migration
  def change
    add_column :users, :token, :string
    add_index :users, :token
  end
end

创建新用户时,请为他们生成一个长的随机令牌。

require 'digest/md5'

class User < ActiveRecord::Base
  before_create :generate_token

  # your other code here...

  private

  def generate_token
   self.token = Digest::MD5.hexdigest(username + rand.to_s)
  end
end

令牌将是一个32个字符的随机十六进制字符串。对于像这样的事情,MD5哈希算法非常快,并且对用户名和随机值进行散列使得几乎不可能猜出某人的令牌。

然后您可以将令牌直接存储在会话中而不是user_id中,并且更难以猜测随机令牌。您可以通过定期更新令牌来更进一步。但是,大多数身份验证系统都会以安全的方式为您处理会话令牌。

相关问题