You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby on Rails抛出异常时如何禁用/隐藏返回内容中的敏感信息

异常敏感信息过滤实现方案

完全可以实现异常抛出时的敏感信息隐藏,你可以参考以下几种落地方式:


方案1:全局异常中间件过滤(通用覆盖场景最广)

该方案可以同时覆盖接口响应、日志、控制台调试时的异常信息敏感字段过滤,是适用性最高的方案。

  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
  1. 注册中间件,在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 05:15:05