Sentry上报ActionDispatch::Http::MimeNegotiation::InvalidType错误如何修复
报错类型:
ActionDispatch::Http::MimeNegotiation::InvalidType
报错提示:"{#context['com.opensymphony.xwork2.dispatcher.httpservletresponse'].addheader('o0scxl85'" is not a valid MIME type
问题根因
该错误由Rails框架的MIME协商模块触发,当请求头的Accept或Content-Type字段携带非法格式值时就会抛出。你看到的异常提示中的字符串是针对Struts2框架漏洞的攻击扫描payload,属于恶意爬虫/扫描器的非法请求,并非业务代码逻辑错误导致。
修复方案
1. 升级Rails到官方修复版本
Rails官方已经在后续版本内置了该类异常的兼容处理,不会直接抛出未捕获的异常上报到Sentry,升级到对应版本即可解决:
- 6.1版本分支:升级到6.1.7及以上版本
- 7.0版本分支:升级到7.0.4及以上版本
- 所有7.1及更新的稳定版本均已修复该问题
2. 新增Rack中间件捕获异常(临时兼容方案)
如果暂时无法升级Rails版本,可以通过新增自定义中间件的方式提前捕获该类异常,直接返回400错误,避免触发告警:
- 在
app/middleware/目录下新建catch_invalid_mime_type.rb文件,写入如下代码:
class CatchInvalidMimeType def initialize(app) @app = app end def call(env) @app.call(env) rescue ActionDispatch::Http::MimeNegotiation::InvalidType [400, { "Content-Type" => "text/plain" }, ["Bad Request"]] end end
- 在
config/application.rb中注册该中间件,让它在请求链路最外层生效:
config.middleware.insert_before 0, CatchInvalidMimeType
3. WAF层拦截恶意请求
可以在Web应用防火墙层配置规则,直接拦截携带Struts2攻击特征、非法MIME格式的请求,从源头避免这类请求到达应用服务。
内容的提问来源于stack exchange,提问作者Kyryl Ωliinyk
相关产品推荐
相关产品推荐

