【问题标题】:How to keep Ruby object instance variables hidden from view in irb or logs?如何在 irb 或日志中隐藏 Ruby 对象实例变量?
【发布时间】:2012-01-08 16:10:31
【问题描述】:

我正在制作一个 gem 来包装一个 API。该服务需要一些登录参数,因此我创建了一个 Connection 类,通过传入所有登录值进行初始化,并使用实例变量进行存储。其中一个值@secret_access_key 显然是秘密的。它在应用程序中不可读。但是在 irb 中测试 gem 时,我看到在返回对象时密钥与所有其他实例变量一起显示。

mws = MWS::Connection.new :access_key => '1', :secret_access_key => 'SECRET!!!', :merchant_id => '3', :marketplace_id => '4'
 => #<MWS::Connection:0x007fbd22acef40 @access_key="1", @merchant_id="3", @marketplace_id="4", @secret_access_key="SECRET!!!">

我很担心密钥会出现在 Heroku 日志、应用程序错误消息或其他任何内容中。

我应该担心吗?如果是这样,存储或隐藏此信息的最佳方式是什么?

另外,我正在使用 httparty gem 来管理这个,我可以用那个 gem 做些更好的事情吗?

【问题讨论】:

    标签: ruby gem httparty


    【解决方案1】:

    您可以使用此解决方法:

    class MWS::Connection
      def inspect
        "#<MWS::Connection:#{object_id}>"
      end
    end
    

    当然,密钥仍然可以访问,但它现在不应该出现在任何日志中:

    mws = MWS::Connection.new :access_key => '1', :secret_access_key => 'SECRET!!!', :merchant_id => '3', :marketplace_id => '4'
    # => #<MWS::Connection:0x007fbd22acef40>
    mws.instance_variable_get(:@secret_access_key) # => 'SECRET!!!'
    

    【讨论】:

      【解决方案2】:
      class MWS::Connection
        def initalize(opts)
          ...
          @secret_access_key = Cypher.encypher(opts[:secret_access_key]) if opts[:secret_access_key]
        end
      
        def secret_access_key
          Cypher.decypher @secret_access_key
        end
      end
      
      class Cypher
        def self.encypher(str)
          str + 'fancy_encryption_protocol'
        end
      
        def self.decypher(str)
          str.sub 'fancy_encryption_protocol$', ''
        end
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-08
        • 2015-02-08
        • 2011-12-09
        • 2012-05-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多