Подтвердить что ты не робот

Вручную отфильтровать параметры в Rails

Как я могу вручную фильтровать хеш с помощью фильтра параметров приложения?

Я предполагаю, что это будет так:

Rails.application.filter :password => 'pass1234'
  # => {:password => '[FILTERED]'}

EDIT (пояснение): Я знаю, что Rails фильтрует хэш params при записи в журналы. То, что я хочу сделать, это применить тот же фильтр к другому хэшу в моей прерогативе, прежде чем записывать его в журналы с чем-то вроде Rails.logger.info. Я вызываю удаленный HTTP-запрос как часть моего приложения (поскольку большая часть бэкэнд работает через удаленный API), и я регистрирую URL и переданные параметры. Я хочу иметь журналы, но также убедиться, что там не обнаружено ни одного из чувствительных параметров.

4b9b3361

Ответ 1

После нескольких минут выстрела, я понял, что это способ сделать это:

filters = Rails.application.config.filter_parameters
f = ActionDispatch::Http::ParameterFilter.new filters
f.filter :password => 'haha' # => {:password=>"[FILTERED]"}

Ответ 2

Смотрите файл config/application.rb, к концу есть строка:

config.filter_parameters += [:password]

Таким образом, параметр "пароль" не будет отображаться в журналах, но вы все равно можете получить доступ к обычному значению.

Edit

Кажется, что вы неправильно поняли свой смысл "фильтра". Что касается уточненной проблемы, я понятия не имею, как обращаться с ней по-настоящему Rails.

Вот подход грубой силы:

  • Разберите запрос с помощью CGI::parse(URI.parse(my_url_address_with_params).query), чтобы получить хэш из параметров/значений (обратите внимание: значения фактически хранятся как массив, вот обсуждение).
  • Найдите параметры, которые вы хотите отфильтровать, и замените значения буквальным *filtered*.
  • Вызовите Rails.logger.info (или debug) непосредственно в журнал.

Вот что вам нужно вникать, полагаясь на магические классы и методы Rails:

В Rails 3 код, который выполняет трюк, кажется, живет в ActionDispatch::Http (ParameterFilter в частности, метод `filter_parameters '). Документацию можно найти в API Dock (или, если честно, очень небольшая документация). Вы можете изучить источники, чтобы понять, как это работает.

Мои знания о внутренних компонентах Rails недостаточно хороши, чтобы предложить что-нибудь еще. Я считаю, что кто-то с лучшим пониманием этого может оказать большую помощь.

Ответ 3

Основываясь на ответе Стивена Сюй выше, я сделал этот инициализатор в своем приложении rails:

class ActionController::Parameters
  def filtered
    ActionDispatch::Http::ParameterFilter.new(Rails.application.config.filter_parameters).filter(self)
  end
end

Позвольте мне называть params.filtered

[1] pry(#<LessonsController>)> params.filtered
{
  "controller" => "lessons",
  "action"     => "search",
  "locale"     => "en"
}
[2] pry(#<LessonsController>)> params[:password] = "bob"
"bob"
[3] pry(#<LessonsController>)> params.filtered
{
  "controller" => "lessons",
  "action"     => "search",
  "locale"     => "en",
  "password"   => "[FILTERED]"
}