Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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
Ruby on rails 为什么要在Rails中动态生成secret_token.rb?_Ruby On Rails_Security_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 为什么要在Rails中动态生成secret_token.rb?

Ruby on rails 为什么要在Rails中动态生成secret_token.rb?,ruby-on-rails,security,ruby-on-rails-4,Ruby On Rails,Security,Ruby On Rails 4,在Hartl的教程中,他重写了secret_token.rb以动态生成秘密令牌。他为什么那样做?只要不进行版本控制,将其存储在文件中有什么区别 Hartl的secure_token.rb代码: require 'securerandom' def secure_token token_file = Rails.root.join('.secret') if File.exist?(token_file) # Use the existing token. File.re

在Hartl的教程中,他重写了secret_token.rb以动态生成秘密令牌。他为什么那样做?只要不进行版本控制,将其存储在文件中有什么区别

Hartl的secure_token.rb代码:

require 'securerandom'

def secure_token
  token_file = Rails.root.join('.secret')
  if File.exist?(token_file)
    # Use the existing token.
    File.read(token_file).chomp
  else
    # Generate a new token and store it in token_file.
    token = SecureRandom.hex(64)
    File.write(token_file, token)
    token
  end
end

SampleApp::Application.config.secret_key_base = secure_token

这很简单。通过这种令牌生成:

  • 您的应用程序已准备好在任何计算机上部署(无需担心创建秘密令牌文件等)
  • 尽管如此,即使您有权访问代码库(例如,如果您将应用程序推送到GitHub),您也不可能获得秘密令牌本身
  • 此外,应用程序的每个安装都将有一个不同的秘密令牌。这意味着,例如,来自开发机器的加密数据(例如密码)在生产应用程序中将是无用的

  • 但是,显示如何生成您的秘密令牌已经足够危险了。您使用的工具或库在任何给定时间点都可能受到攻击。

    这很简单。通过这种令牌生成:

  • 您的应用程序已准备好在任何计算机上部署(无需担心创建秘密令牌文件等)
  • 尽管如此,即使您有权访问代码库(例如,如果您将应用程序推送到GitHub),您也不可能获得秘密令牌本身
  • 此外,应用程序的每个安装都将有一个不同的秘密令牌。这意味着,例如,来自开发机器的加密数据(例如密码)在生产应用程序中将是无用的


  • 但是,显示如何生成您的秘密令牌已经足够危险了。您使用的工具或库在任何给定时间点都可能受到攻击。

    更好的方法是使用环境变量。这就不那么痛苦了。有些主机(如Heroku)提供只读环境,因此无法工作,因为每次部署时都会删除文件
    。secret
    ,这意味着每次签名的cookie都会失效。此外,这段代码会减慢应用程序的初始化速度,这很奇怪。将其与App.config.secret\u key\u base=ENV['SECURE\u TOKEN']'some\u TOKEN'进行比较。这正是我的意思。另外,管理环境变量比这段代码要容易得多(而且也是持久性的)。@ukaszNiemier:你能想出Hartl在他的教程中包含它的原因吗?我不知道。也许他不喜欢环境变量?或者他就是不习惯这样。问问他。为什么不问问他?更好的办法是使用环境变量。这就不那么痛苦了。有些主机(如Heroku)提供只读环境,因此无法工作,因为每次部署时都会删除文件
    。secret
    ,这意味着每次签名的cookie都会失效。此外,这段代码会减慢应用程序的初始化速度,这很奇怪。将其与App.config.secret\u key\u base=ENV['SECURE\u TOKEN']'some\u TOKEN'进行比较。这正是我的意思。另外,管理环境变量比这段代码要容易得多(而且也是持久性的)。@ukaszNiemier:你能想出Hartl在他的教程中包含它的原因吗?我不知道。也许他不喜欢环境变量?或者他就是不习惯这样。问他。你为什么不问他?如果你不控制你的secure_token.rb的版本,原因2就不对了。还是我错了?是的,你是对的。只要你不进行版本控制,就没有令牌。我已经更新了我的答案。@marvelousNinja-
    SecureRandom
    是安全的。显示您生成的安全令牌并没有那么不安全(正如
    rakesecret
    所做的那样)。我不是说生成令牌的具体方式。公开你的算法只是展示你是如何做的。这是攻击者一直想要的知识。如果您不控制secure_token.rb的版本,则原因2将不正确。还是我错了?是的,你是对的。只要你不进行版本控制,就没有令牌。我已经更新了我的答案。@marvelousNinja-
    SecureRandom
    是安全的。显示您生成的安全令牌并没有那么不安全(正如
    rakesecret
    所做的那样)。我不是说生成令牌的具体方式。公开你的算法只是展示你是如何做的。这是攻击者一直想要的知识。