ruby Airbrake抛出错误Airbrake::Filters::KeysBlacklist中的模式之一在使用自定义进程时无效

gj3fmq9x  于 12个月前  发布在  Ruby
关注(0)|答案(1)|浏览(78)

在我们的应用程序中,我们希望根据它们的使用情况对某些参数进行不同的过滤。例如,密码应该始终被完全过滤,但是对于电子邮件和名称,我们希望保留部分值以用于调试和支持。
为此,我们使用自定义proc来格式化它们:
1_filter_parameter_logging.rb

Rails.application.config.filter_parameters += [
  :password
]

Rails.application.config.filter_parameters << proc do |param_name, value|
  if %w[email name].include?(param_name)
    if param_name.to_s == 'email'
      value.gsub!(/(?<=^.{2}).*?(?=@)/, '*') # test partial filter
    else
      value.replace('[FILTERED_CUSTOM]') # test custom filter
    end
  end
end

然后在2_airbrake.rb中,我们使用这些设置:

c.blacklist_keys = Rails.application.config.filter_parameters

为了测试这个理论,我们故意在我们的应用程序中抛出一个异常,这个例子是控制器操作:

class ExampleController
  def show
    raise StandardError, 'Testing Filter Parameter Logging'
  end
end

然后向该端点发出一个简单的请求:

http://localhost:3000/example?name=cameron&[email protected]&password=test

在我们的日志中,我们看到以下内容:

Processing by ExampleController#show as HTML
  Parameters: {"name"=>"[FILTERED_CUSTOM]", "email"=>"ca*@test.com", "password"=>"[FILTERED]"}

然后是Airbake的一个错误:

**Airbrake: one of the patterns in Airbrake::Filters::KeysBlacklist is invalid. Known patterns: [:password, nil]

如果我们看看Airbrake中的错误,我们会看到它没有过滤它们:

{
  "action" => "show",
  "controller" => "example",
  "email" => "[email protected]",
  "name" => "cameron",
  "password" => "[Filtered]"
}

为什么Airbrake抛出这个错误,看起来Rails能够根据这些日志使用那个proc过滤那些参数,但是Airbrake过滤失败,允许它们通过。
空气制动并不能解释什么是无效的模式...只是它不认为它是有效的,这不是很有帮助。

c2e8gylq

c2e8gylq1#

Rails提供的参数过滤与Airbrake不同。
Rails允许复杂的参数过滤。您可以定义一个proc,它接受参数keyvalue作为参数,并返回过滤后的值。proc的执行发生在ActiveSupport::ParameterFilter#value_for_key中。
空气制动更有限。它只能通过与String、Symbol或Regexp进行比较来过滤参数名称。文档指出,您可以定义proc,但它只在第一次通知时执行一次,并且:
Proc must 返回一个仅由元素组成的Array,这些元素被认为对此选项有效。
在这里执行proc。调用时不带任何参数。如果不带参数调用示例proc,则返回nil。由于这与String、Symbol或Regexp不匹配,因此这里会引发异常。
Airbrake使用一个should_filter?方法,它只接受参数key。如果该方法返回true,则"[Filtered]"字符串将替换该值。这种现有的结构不容易快速覆盖以获得您想要的行为。但是您可以尝试完全覆盖Airbrake::Filters::KeysBlocklist类和Airbrake::Filters::KeysFilter模块。
请注意,这里的信息和所有链接都是针对当前版本的airbrake-rubyblacklist_keys在几年前被blocklist_keys取代。像KeysBlacklist这样的类被KeysBlocklist取代。但这些只是名称的变化,功能随着时间的推移保持相对不变。
与其覆盖标准的Airbrake参数过滤,你最好尝试添加一个自定义过滤器。下面是一个示例,说明您可以尝试将哪些内容放入应用中的初始化器中:

Airbrake.add_filter do |notice|
  notice[:params].each do |key, value|
    if key == :email
      value.gsub!(/(?<=^.{2}).*?(?=@)/, '*')  # test partial filter
    elsif key == :name
      value.replace('[FILTERED_CUSTOM]')  # test custom filter
    end
  end
end

相关问题