Как сохранить переменные экземпляра объекта Ruby скрытыми от просмотра в irb или журналах? - PullRequest
1 голос
/ 08 января 2012

Я делаю драгоценный камень, чтобы обернуть API. Службе требуется несколько параметров входа в систему, поэтому я создал класс Connection для инициализации, передав все значения входа и сохранив их с переменными экземпляра. Очевидно, одно из этих значений @secret_access_key является секретным. Это не читается в приложении. Но во время тестирования gem в irb я вижу секретный ключ, отображаемый вместе со всеми другими переменными экземпляра, когда объект возвращается.

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 для управления этим, есть ли что-то лучшее, что я могу сделать с этим камнем?

Ответы [ 2 ]

4 голосов
/ 08 января 2012

Вы можете использовать этот обходной путь:

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 голосов
/ 08 января 2012
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
...