Rails: фильтрация конфиденциальных данных в параметре JSON из журналов

Я использую Rails 3 и пытаюсь отфильтровать конфиденциальную информацию из наших журналов, которые являются BLOB-объектами JSON и передаются в качестве параметров post. Например, создание пользователя может принимать пост-параметр user со строковым значением, которое является объектом JSON. Одним из ключей в объекте JSON является password и мы хотим отфильтровать это из наших журналов. Лучший способ сделать это - добавить блок в наши filter_params, вот так:

keys_to_filter = ['password', 'password_confirmation']
config.filter_parameters << lambda do |k,v|
  if v.is_a? String
    keys_to_filter.each do |key|
      # Match "key":"<filter_out>", or "key":"<filter_out>"}, allowing for whitespace
      v.sub!(/("\s*#{key}\s*")\s*:\s*"[^,\}]*"\s*([,\}])/, "\\1:\"[FILTERED]\"\\2")
    end
  end
end

Это добавляет блок к filter_params, что вызывает ошибку, которая описана в другом вопросе: Rails: ParameterFilter:: compiled_filter пытается дублировать символ

Похоже, что небезопасно передавать блок в filter_parameters, поэтому мне интересно, есть ли другой способ решить эту проблему.

4 ответа

Почему ответ @ Несбитта недооценен (внизу)? Конечно, он ссылается на код в наборе тестов, но этот набор тестов просто тестирует функцию, задокументированную в ActionDispatch:: Http:: FilterParameters:

Если указан блок, каждому ключу и значению хэша params и всех подэташей передается в него, значение или ключ можно заменить с помощью String#replace или аналогичного метода.

Смотрите комментарии в документации по API для Rails 3.x здесь.

Мне нужно было сделать то же самое: преобразовать поле в BLOB-объект JSON, который был отправлен с HTTP-запросом POST, в приложение Rails 3. В моем случае я просто хотел включить хешированный дайджест поля, поэтому в config / application.rb:

config.filter_parameters += [:password, lambda {|key, value|
  if key.to_s == 'my_key'
    value.replace(calculate_my_hash(value))
  end
}]

Есть пример передачи блока filter_parameters в тестовом наборе Rails:

config.filter_parameters += [ :foo, 'bar', lambda { |key, value|
  value = value.reverse if key =~ /baz/
 }]

Я занимаюсь разработкой приложения на Rails 3 и использую Backbone.js. Я передаю объекты JSON при создании или обновлении записи. Я отверг функцию toJSON моей модели Backbone и жестко запрограммировал параметр пароля, чтобы проверить вашу проблему. В моем случае config.filter_parameters - это просто [:password], и он корректно фильтрует параметры пароля в журналах. Сначала я проверил это в обновлении, которое отправляет запрос PUT. Затем я протестировал это в create с запросом POST, чтобы проверить, есть ли какая-либо особая ошибка при отправке POST. Пароль по-прежнему фильтруется правильно. Я что-то пропустил?

Похоже, config.filter_parameters работает правильно, без необходимости передавать блок.

Я имел дело с той же проблемой в нашем приложении. Я закончил тем, что блокировал всю строку JSON от регистрации, где были безопасные данные, и затем добавил явные регистраторы для любой информации, которую я хотел зарегистрировать.

Другие вопросы по тегам