【问题标题】:How to filter sensitive information when logging with Sinatra and Rack Logger使用 Sinatra 和 Rack Logger 记录时如何过滤敏感信息
【发布时间】:2013-02-28 19:22:21
【问题描述】:

我维护一个充当 JSON API 服务的 Sinatra 应用程序。该 API 由另一个网络应用和移动应用使用。

我想让 Rack::CommonLogger 从其日志中排除敏感信息,例如密码。 Rails 已启用此设置,但我在 Sinatra 中没有找到有关如何执行此操作的文档。

【问题讨论】:

    标签: ruby logging sinatra rack


    【解决方案1】:

    您可以尝试拦截调用以编写和过滤掉敏感消息,如下所示:

    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
    

    【讨论】:

    • 如果您将此 sn-p 添加到 config.ru,您需要将新记录器创建为 ::Logger.new。 (是的,添加两个冒号,以便您在根命名空间中查找 Logger,而不是当前的。)否则,您将获得一个不起作用的 Rack::Logger 实例(没有
    【解决方案2】:

    Sinatra 登录到 STDERR,这是一个 IOm,但我们不想存储其他人的密码:

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

    【讨论】:

    • 这在原则上是有效的,但也将匹配非空格字符(即,password=FOO&amp;user=bar 将变形为password=[FILTERED])。除此之外,如果您曾经想要使用IO 对象将password= 写入流,这会影响到。
    • 为了使这个更通用(并且正则表达式更正确),您可以这样做:%w(token password).each { |filter_param| args.first.sub!(/#{filter_param}=\S+?\b/, "#{filter_param}=[FILTERED]") },但我认为(例如)如果我正在构建一个需要发送凭据的代理相同的格式,由于我上面提到的问题,这会中断。
    【解决方案3】:

    您也可以利用ActiveSupport::ParameterFilter

    https://edgeapi.rubyonrails.org/classes/ActiveSupport/ParameterFilter.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      • 2022-01-02
      • 1970-01-01
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多