Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
非单调SQL ID值_Sql_Ruby On Rails_Security - Fatal编程技术网

非单调SQL ID值

非单调SQL ID值,sql,ruby-on-rails,security,Sql,Ruby On Rails,Security,我被要求将所有SQL表的ID值随机化。原因是竞争对手无法根据我们ID值的增长推断网站流量 rails中的默认设置是使用ID作为索引、外键和URL路径。这些ID线性增加 接下来,为所有表生成伪随机整数作为ID的最简单方法是什么?有没有我可以扔进去的宝石 注意:Rails有时会遇到非整数值的问题,因此我希望使用整数。这与Rails无关,因为数据库的惯例是使用自动递增主键 对于新表,为了防止rails使用此约定,您需要告诉它不要自动创建id列,而是自己创建 # example of creating

我被要求将所有SQL表的ID值随机化。原因是竞争对手无法根据我们ID值的增长推断网站流量

rails中的默认设置是使用ID作为索引、外键和URL路径。这些ID线性增加

接下来,为所有表生成伪随机整数作为ID的最简单方法是什么?有没有我可以扔进去的宝石


注意:Rails有时会遇到非整数值的问题,因此我希望使用整数。

这与Rails无关,因为数据库的惯例是使用自动递增主键

对于新表,为了防止rails使用此约定,您需要告诉它不要自动创建id列,而是自己创建

# example of creating a users table

create_table :users, id: false do |t|
  t.integer :id
  # other column definitions
end

add_index :users, [:id], unique: true, name: 'index_id_on_users'
然后在您的模型中,您需要在创建记录之前显式地设置它

class User < ActiveRecord::Base
  before_create :set_id

  def set_id
    loop do
      self.id = rand(1<<32)
      break unless User.exists?(self.id)
    end
  end
end
这里需要注意的是,您的db/schema.rb不会反映更改,这使得db:schema:load无法生成正确的数据库,尽管我可以说我从来没有使用过该rake任务来加载数据库。只要使用db:migrate就可以了

和往常一样,确保在运行这样的命令之前备份数据库。我刚刚在我的开发环境中的sqlite3上运行了它,它似乎工作正常



更新#1


如果您只关心URL,那么另一种方法是使用slug而不是ID。有一些gem可以通过一些配置和一些新列来处理这个问题。基本上,这个想法是使用一个列作为url参数。因此,当您使用URL帮助程序而不是输出/resources/1时,它将输出/resources/一些URL友好的slug。这可以是像UUID或SHA这样的神秘的东西,也可以是SEO友好的东西。这取决于模型中是否有什么东西可以打击。例如,如果它是一个产品路径,并且产品有一个标题,那么slug可能是一个url友好的产品标题版本,非常适合搜索引擎优化。

Hmmm。。。rails支持使用s吗?与随机ID相比,它应该有两个优点:1)它们可以单调增加,所以它可以很好地处理索引(放在表的末尾)。2) 唯一值,因此不必检查表中是否已存在该值。当然,这通常大于一个整数。客户数:您担心向竞争对手泄露什么样的数据?什么是只公开内部id?隐藏此信息的方法不止一种。用河豚“加密”id如何?这意味着以前的URL不再工作,哦,好吧。(我只是半开玩笑…)鼻涕虫,嗯?我从未听说过这个词,但我想它描述了我在寻找什么。我只是需要那个术语。谢谢!现在我可以涉过外面的一切了。下面是一些可能有用的好宝石的列表。
change_column :users, :id, :integer