Rails 3.2.x: 如何使用 ActionController 操作过滤长参数以防止记录?
Rails 3.2.x: how to filter long parameters from getting logged using ActionController action?
类似的问题还有this, this, and this.
None 有帮助,因为目标是防止在特定操作中记录长参数而不是使用 config.filter_parameters
。此外,答案必须适用于 Rails 3.2.x 而许多答案基于 Rails 5.
一个答案建议在控制器方法中调用 request.filtered_parameters
,但调用 request.filtered_parameters.delete :long_param
并没有阻止 :long_param
被记录。
config.filter_parameters
采用 lambda 函数,因此您可以根据需要进行过滤。查看答案 here and here。
如果您只想过滤针对特定操作的冗长争论,那么,您会让您的生活不必要地变得复杂。要么过滤所有长参数,使用 lambda 设置参数值长度限制,要么更改要过滤的操作的参数键,使其唯一,然后按该键过滤。
这可以在 中间件过滤器
的帮助下实现
创建新文件app/middleware/filter_long_params.rb
class FilterLongParams
def initialize(app, long_params = [])
@app = app
@long_params = long_params
end
def call(env)
env["action_dispatch.parameter_filter"] += @long_params unless @long_params.empty?
status, headers, response = @app.call(env)
[status, headers, response]
end
end
然后添加到您的控制器
class YourController
use FilterLongParams, [:long_param_to_be_filtered], only: :update
end
use
的第一个参数是中间件的名称class,第二个参数应该是你要过滤的参数数组,第三个可能是控制器动作的通常范围。
如果 Rails 3.2 不自动加载 app/middleware
路径,请改用 app/controllers
。
类似的问题还有this, this, and this.
None 有帮助,因为目标是防止在特定操作中记录长参数而不是使用 config.filter_parameters
。此外,答案必须适用于 Rails 3.2.x 而许多答案基于 Rails 5.
一个答案建议在控制器方法中调用 request.filtered_parameters
,但调用 request.filtered_parameters.delete :long_param
并没有阻止 :long_param
被记录。
config.filter_parameters
采用 lambda 函数,因此您可以根据需要进行过滤。查看答案 here and here。
如果您只想过滤针对特定操作的冗长争论,那么,您会让您的生活不必要地变得复杂。要么过滤所有长参数,使用 lambda 设置参数值长度限制,要么更改要过滤的操作的参数键,使其唯一,然后按该键过滤。
这可以在 中间件过滤器
的帮助下实现创建新文件app/middleware/filter_long_params.rb
class FilterLongParams
def initialize(app, long_params = [])
@app = app
@long_params = long_params
end
def call(env)
env["action_dispatch.parameter_filter"] += @long_params unless @long_params.empty?
status, headers, response = @app.call(env)
[status, headers, response]
end
end
然后添加到您的控制器
class YourController
use FilterLongParams, [:long_param_to_be_filtered], only: :update
end
use
的第一个参数是中间件的名称class,第二个参数应该是你要过滤的参数数组,第三个可能是控制器动作的通常范围。
如果 Rails 3.2 不自动加载 app/middleware
路径,请改用 app/controllers
。