2013-03-13 2 views
3

Я поддерживаю приложение Sinatra, которое действует как служба JSON API. API используется другим веб-приложением, а также мобильным приложением.Фильтрация конфиденциальной информации с помощью Sinatra и Rack Logger

Что мне нужно сделать, так это наличие стойки :: CommonLogger исключает конфиденциальную информацию, такую ​​как пароль, из ее журналов. У Rails этот параметр включен, но я не нашел документацию о том, как это сделать в Sinatra.

Любая помощь будет оценена по достоинству.

ответ

5

Вы можете попытаться перехватить вызов, чтобы написать и отфильтровать конфиденциальные сообщения, как так:

logger = Logger.new("my_common.log") 
logger.instance_eval do 
    def write(msg) 
    self.send(:<<, msg) if !msg.match /SUPER SENSITIVE INFO HERE/ 
    end 
end 

затем настройте Rack :: CommonLogger использовать этот экземпляр регистратора:

config.middleware.use Rack::CommonLogger, logger 

Надеется, что это помогает

+0

Если вы добавляете этот фрагмент в config.ru, вам нужно создать новый регистратор как :: Logger.new. (Да, добавьте два двоеточия, чтобы вы искали Logger в корневом пространстве имен, а не в текущем.) В противном случае вы получите экземпляр Rack :: Logger, который не работает (нет << метода, и т.д). –

0

Синатру журналов Stderr который является IOM, но мы не хотим, чтобы хранить пароли других народов

module NoTokenLogging 
    def write(*args) 
    args.first.sub!(/password=\S+/, "password=[FILTERED]") 
    super 
    end 
end 
IO.prepend NoTokenLogging 
+0

Это работает в принципе, но также будет соответствовать непространственным символам (например, 'password = FOO & user = bar' превратится в' password = [FILTERED] '). Наряду с этим это повлияет, если вы хотите использовать объект 'IO' для записи' password = 'в поток. – Blaskovicz

+0

Чтобы сделать это более общее (и правильное регулярное выражение), вы можете сделать: '% w (токеновый пароль) .each {| filter_param | args.first.sub! (/ # {filter_param} = \ S +? \ b /, "# {filter_param} = [FILTERED]")} ', но я думаю (например), если я создаю прокси-сервер, который вам нужен чтобы отправить учетные данные в том же формате, это сломается из-за проблемы, о которой я упоминал выше. – Blaskovicz

Смежные вопросы