Azure WAF拦截PUT请求:403 ModSecurity Action与JSON解析异常排查
解决PUT请求触发OWASP 3.0规则200002导致的403/400错误
我刚踩过几乎一模一样的坑,分享下我的排查过程和解决办法:
问题复盘
最开始我也以为是Azure WAF的REQUEST-911-METHOD-ENFORCEMENT规则拦了PUT请求——毕竟GET/POST都正常,唯独PUT报403。结果找网络团队拉了完整请求日志才发现,实际是OWASP 3.0规则集的200002强制规则在拦截,返回的真实状态码是400,原因是请求体的JSON格式不规范:对象键没有用字符串包裹,不符合JSON标准。
更迷惑的是,我用Swagger和Postman测试时完全没问题,后来才反应过来:这俩工具会自动帮你修正不规范的JSON,把未加引号的键补上,所以本地测不出来问题。
解决步骤
先验证问题根源
别用工具,直接用curl发送一个键不带引号的原始请求,比如:curl -X PUT https://your-api-url/endpoint -d '{id: 123, value: "test"}' -H "Content-Type: application/json"这个请求大概率会触发同样的400错误,确认是JSON格式的问题。
修复代码里的JSON生成逻辑
检查你发送PUT请求的代码:- 如果是手动拼接JSON字符串,确保所有对象键都用双引号包裹(比如把
{id: 123}改成{"id": 123}) - 如果用的是序列化库(比如C#的Newtonsoft.Json、Java的Jackson),检查库的配置有没有开启宽松模式——有些库默认会允许不带引号的键,但生产环境的WAF规则是严格遵循JSON规范的
- 如果是手动拼接JSON字符串,确保所有对象键都用双引号包裹(比如把
临时应急方案(非长久之计)
如果赶上线来不及改代码,可以和安全团队沟通,针对你的API路径临时禁用OWASP 200002规则,但这只是权宜之计,最终还是要把JSON格式修正过来,避免后续其他规则触发问题。
内容的提问来源于stack exchange,提问作者IeuanW
相关产品推荐
相关产品推荐

