【发布时间】:2013-02-28 19:22:21
【问题描述】:
我维护一个充当 JSON API 服务的 Sinatra 应用程序。该 API 由另一个网络应用和移动应用使用。
我想让 Rack::CommonLogger 从其日志中排除敏感信息,例如密码。 Rails 已启用此设置,但我在 Sinatra 中没有找到有关如何执行此操作的文档。
【问题讨论】:
我维护一个充当 JSON API 服务的 Sinatra 应用程序。该 API 由另一个网络应用和移动应用使用。
我想让 Rack::CommonLogger 从其日志中排除敏感信息,例如密码。 Rails 已启用此设置,但我在 Sinatra 中没有找到有关如何执行此操作的文档。
【问题讨论】:
您可以尝试拦截调用以编写和过滤掉敏感消息,如下所示:
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
【讨论】:
Sinatra 登录到 STDERR,这是一个 IOm,但我们不想存储其他人的密码:
module NoTokenLogging
def write(*args)
args.first.sub!(/password=\S+/, "password=[FILTERED]")
super
end
end
IO.prepend NoTokenLogging
【讨论】:
password=FOO&user=bar 将变形为password=[FILTERED])。除此之外,如果您曾经想要使用IO 对象将password= 写入流,这会影响到。
%w(token password).each { |filter_param| args.first.sub!(/#{filter_param}=\S+?\b/, "#{filter_param}=[FILTERED]") },但我认为(例如)如果我正在构建一个需要发送凭据的代理相同的格式,由于我上面提到的问题,这会中断。
您也可以利用ActiveSupport::ParameterFilter。
https://edgeapi.rubyonrails.org/classes/ActiveSupport/ParameterFilter.html
【讨论】: