Ruby on Rails抛出异常时如何禁用/隐藏返回内容中的敏感信息
异常敏感信息过滤实现方案
完全可以实现异常抛出时的敏感信息隐藏,你可以参考以下几种落地方式:
方案1:全局异常中间件过滤(通用覆盖场景最广)
该方案可以同时覆盖接口响应、日志、控制台调试时的异常信息敏感字段过滤,是适用性最高的方案。
- 新增异常过滤中间件
# app/middleware/sensitive_exception_filter.rb class SensitiveExceptionFilter # 可扩展你需要过滤的其他敏感信息正则,比如手机号、身份证号等 SENSITIVE_PATTERNS = { email: /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/i } def initialize(app) @app = app end def call(env) @app.call(env) rescue StandardError => e filter_exception_message(e) raise e end private def filter_exception_message(exception) # 过滤当前异常信息 filtered_msg = exception.message SENSITIVE_PATTERNS.each_value do |regex| filtered_msg = filtered_msg.gsub(regex, '[FILTER]') end exception.define_singleton_method(:message) { filtered_msg } # 递归过滤关联的异常cause return unless exception.cause filter_exception_message(exception.cause) end end
- 注册中间件,在
config/application.rb中添加如下配置:
config.middleware.insert_before 0, SensitiveExceptionFilter
方案2:扩展PostgreSQL适配器(针对性处理数据库异常)
如果你只需要过滤数据库抛出的异常信息,可以直接修改PG适配器的错误处理逻辑:
在config/initializers/postgresql_sensitive_filter.rb中添加如下代码:
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do alias_method :original_exec_params, :exec_params def exec_params(sql, params, *args) original_exec_params(sql, params, *args) rescue PG::Error => e filtered_msg = e.message.gsub(/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/i, '[FILTER]') e.define_singleton_method(:message) { filtered_msg } raise e end end
效果验证
配置完成后,再次执行你给出的测试代码,异常输出中的邮箱就会自动被替换为[FILTER],和你预期的输出效果完全一致。
内容的提问来源于stack exchange,提问作者José Esmerino
相关产品推荐
相关产品推荐

