在我们的应用程序中,我们希望根据它们的使用情况对某些参数进行不同的过滤。例如,密码应该始终被完全过滤,但是对于电子邮件和名称,我们希望保留部分值以用于调试和支持。
为此,我们使用自定义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过滤失败,允许它们通过。
空气制动并不能解释什么是无效的模式...只是它不认为它是有效的,这不是很有帮助。
1条答案
按热度按时间c2e8gylq1#
Rails提供的参数过滤与Airbrake不同。
Rails允许复杂的参数过滤。您可以定义一个
proc
,它接受参数key
和value
作为参数,并返回过滤后的值。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-ruby
。blacklist_keys
在几年前被blocklist_keys
取代。像KeysBlacklist
这样的类被KeysBlocklist
取代。但这些只是名称的变化,功能随着时间的推移保持相对不变。与其覆盖标准的Airbrake参数过滤,你最好尝试添加一个自定义过滤器。下面是一个示例,说明您可以尝试将哪些内容放入应用中的初始化器中: