【问题标题】:How can I filter sensitive parameters from the SQL portion of Rails 5 logs?如何从 Rails 5 日志的 SQL 部分过滤敏感参数?
【发布时间】:2023-03-27 04:42:01
【问题描述】:

Rails 5 提供参数过滤,我在application.rb 中指定了config.filter_parameters += ["my_token"]。

在开发(环境)模式下测试我的应用程序,我看到 my_token 已从日志文件的请求行中正确过滤:

Started GET "/something?my_token=[FILTERED]"

但是,紧随其后的 SQL 日志行仍然包含纯文本形式的参数值(“SELECT stuff FROM things”等,以 my_token 作为参数)。

Rails 5 是否提供了一种从其日志文件的 SQL 部分过滤此原始值的方法?

我还在生产模式下运行了我的应用程序,虽然日志文件更简洁,但它们仍然在 D 类日志行中为生成的 SQL 语句显示未过滤的值。

我没有指定自定义日志设置——除了我的过滤器参数设置之外的所有设置都是默认设置。

我自己的搜索显示没有相关的讨论。也许我错过了什么?

谢谢!

【问题讨论】:

  • 理论上你不应该在生产模式下看到 sql 日志。您是否更改了默认生产配置?
  • 我遇到了同样的问题。我猜答案可能是(a)任何敏感的东西(比如密码)都应该在存储之前加密/散列,(b)你应该把你的日志文件和你的数据库一样敏感。不过,我仍然希望能够过滤 SQL 查询参数!

标签: ruby-on-rails ruby-on-rails-5


【解决方案1】:

Rails 7

见Matthewanswer。

Rails 6 及以下

如果您想完全禁用 SQL 日志以进行生产,您可以将config/environments/production.rb 中的日志级别更改为:info

  config.log_level = :info

如果您只想对包含敏感数据的少数查询进​​行静音记录,您可以使用Rails.logger.silence。它在提供的块的持续时间内使日志静音。所以它可以用来避免将特定的 SQL 查询写入日志。

用法:

def index
  Rails.logger.silence do
    # load method is used to force query execution inside the block
    @items = Item.all.load 
  end
end

请记住,查询是延迟执行的,所以如果查询是在块之外执行的,它无论如何都会被记录下来。以下示例将失败:

def index
  Rails.logger.silence do
    # The query will be executed outside the block when @items is first used in the view
    @items = Item.all
  end
end

【讨论】:

  • 对于许多用例来说绝对是一个有用的答案。但是,就像提出问题的人一样,我仍然希望查看查询日志,尤其是会话和时间信息,以及参数化查询字符串本身。我只是不想在日志中看到敏感的 SQL 查询参数。不过,似乎没有办法做到这一点。 :-(
【解决方案2】:

终于在 Rails 7.0.0 中修复了!

来自更新日志:

*   Filter attributes in SQL logs

    Previously, SQL queries in logs containing `ActiveRecord::Base.filter_attributes` were not filtered.

    Now, the filter attributes will be masked `[FILTERED]` in the logs when `prepared_statement` is enabled.

    ```
    # Before:
      Foo Load (0.2ms)  SELECT "foos".* FROM "foos" WHERE "foos"."passw" = ? LIMIT ?  [["passw", "hello"], ["LIMIT", 1]]
    # After:
      Foo Load (0.5ms)  SELECT "foos".* FROM "foos" WHERE "foos"."passw" = ? LIMIT ?  [["passw", "[FILTERED]"], ["LIMIT", 1]]
    ```

https://github.com/rails/rails/pull/42006

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 2011-01-04
    • 1970-01-01
    相关资源
    最近更新 更多