Фильтрация частей или всего URL-адреса запроса из журналов rails

Rails предоставляет filter_parameter_logging для фильтрации чувствительных параметров из журнала рельсов.

Если у вас есть API JSONP, в URL-адрес может присутствовать некоторая конфиденциальная информация. Есть ли способ фильтрации URL-адресов запроса из журнала также?

Ответ 1

Примечание. Ответ здесь - способ заставить его работать с Rails 2.x ~ > 3.0. Начиная с Rails 3.1, если вы установите config.filter_parameters, Rails также отфильтрует чувствительный параметр в строке запроса. Подробнее см. этот коммит.


Я думаю, что в этом случае вам нужно переопределить complete_request_uri в ActionController:: Base, так как ActionController:: Benchmarking вызывает этот метод и печатает строку, которая выглядит следующим образом:

Completed in 171ms (View: 35, DB: 7) | 200 OK [http://localhost:3000/]

Я думаю, вы можете поместить это в инициализатор, чтобы переопределить этот метод

class ActionController::Base
  private

  def complete_request_uri
    "#{request.protocol}#{request.host}#{request.request_uri.gsub(/secret=([a-z0-9]+)/i, "secret=[FILTERTED]")}"
  end
end

Обратите внимание, что вам нужно немного поиграть с регулярным выражением, чтобы он заменил нужную вам часть.

Ответ 2

К сожалению, это больше не работает в Rails 3. Путь (включая параметры запроса) поступает из ActionDispatch:: Request, который наследуется от Rack:: Request. Здесь соответствующая опция monkeypatch, которую вы можете ввести в инициализатор:

class ActionDispatch::Request
  def fullpath
    @fullpath ||= super.gsub(/secret=[^&]+/, 'secret=[FILTERED]')
  end
end

Я переключился на использование [^&] в регулярном выражении, так как параметр мог легко содержать символы, которые не являются буквами или цифрами в нем.