ruby-on-rails – 如何在rails中混淆我的记录的id?
发布时间:2020-12-16 19:49:37 所属栏目:百科 来源:网络整理
导读:我试图弄清楚如何在轨道上混淆我的记录的ids. 例如:一个典型的路径可能看起来像http://domain/records/1,所以人们很容易推断网站获得的流量,如果他们只是创建一个新的记录. 我使用的一个解决方案是使用盐对id进行散列,但是由于我不知道这个函数是否是双射的
我试图弄清楚如何在轨道上混淆我的记录的ids.
例如:一个典型的路径可能看起来像http://domain/records/1,所以人们很容易推断网站获得的流量,如果他们只是创建一个新的记录. 我使用的一个解决方案是使用盐对id进行散列,但是由于我不知道这个函数是否是双射的,所以我最终将它存储在数据库的另一个列中,并重新检查其唯一性. 我正在考虑的另一个选择是生成随机哈希,并将其另存为另一列.如果它不是唯一的…只是生成另一个. 这样做最好的方法是什么? 解决方法
您可以使用内置的OpenSSL库来加密和解密您的标识符,这样您只需要在模型上覆盖to_param即可.您还需要使用Base64将加密数据转换为纯文本.我会把它粘在一个模块中,以便可以重用:
require 'openssl' require 'base64' module Obfuscate def self.included(base) base.extend self end def cipher OpenSSL::Cipher::Cipher.new('aes-256-cbc') end def cipher_key 'blah!' end def decrypt(value) c = cipher.decrypt c.key = Digest::SHA256.digest(cipher_key) c.update(Base64.decode64(value.to_s)) + c.final end def encrypt(value) c = cipher.encrypt c.key = Digest::SHA256.digest(cipher_key) Base64.encode64(c.update(value.to_s) + c.final) end end 所以现在你的模型需要看起来像这样: class MyModel < ActiveRecord::Base include Obfuscate def to_param encrypt id end end 然后在您的控制器中,当您需要通过加密的ID找到记录时,您将使用以下内容: MyModel.find MyModel.decrypt(params[:id]) 如果您希望加密/解密ids而不将其存储在数据库中,这可能是最简单的方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |