Rails: фильтрация конфиденциальных данных в параметре JSON из журналов - PullRequest
10 голосов
/ 10 марта 2011

Я использую 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 ]

2 голосов
/ 07 апреля 2016

Почему ответ @ Несбитта опущен (внизу)? Конечно, он ссылается на код в наборе тестов, но этот набор тестов просто тестирует функцию, задокументированную в 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
}]
1 голос
/ 21 июля 2011

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

Похоже, что config.filter_parameters работает правильно, не пропуская блок.

1 голос
/ 03 июня 2011

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

config.filter_parameters += [ :foo, 'bar', lambda { |key, value|
  value = value.reverse if key =~ /baz/
 }]
0 голосов
/ 14 июля 2011

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

...