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

为什么包含'or的字符串在AJAX调用中经.serialize()处理后验证失败

问题根因

你遇到的是Web应用防火墙(WAF)的SQL注入防护规则误拦截。'or是经典SQL注入payload(比如' or 1=1--)的特征前缀,绝大多数WAF的默认规则都会匹配到该特征后直接拦截请求,请求根本不会到达业务控制器层,所以你前端修改序列化逻辑、替换字符都没有效果,而O'Sullivan没有'or特征,就不会被拦截。

验证方法

  • 直接在后端服务的本地内网环境提交D'oreily测试,如果本地可以正常提交,即可确认是公网入口的WAF拦截。
  • 查看WAF的拦截日志,能直接看到命中的SQL注入防护规则,特征值就是'or(规则通常大小写不敏感,所以大小写组合都会触发)。

解决方案

方案1:调整WAF规则(最优)

如果WAF是你方可控的(比如云厂商WAF、服务器部署的ModSecurity等):

  • 针对该表单提交的接口添加规则例外,仅放行该接口下指定参数(比如姓名参数)的'or合法字符串,不要全局放开规则避免降低安全防护能力。
  • 也可以适当调低对应接口的SQL注入检测阈值,减少对正常业务内容的误拦截。

方案2:参数编码提交

如果暂时无法调整WAF规则,可以前端对敏感参数编码后提交,服务端接收后解码即可:

// 前端单独编码姓名类敏感参数
let formData = $("form").serializeArray();
formData.forEach(item => {
  // 替换为你实际的姓名字段名,也可以全量参数都做编码
  if(item.name === 'user_name') {
    item.value = encodeURIComponent(item.value);
  }
});
$.ajax({
  // 其余ajax配置不变
  data: $.param(formData)
})

服务端接收到参数后做对应解码操作,就能拿到原始输入内容。

方案3:占位符替换(临时应急)

如果编码改造成本高,可以用业务中不可能出现的特殊字符组合作为占位符做前后端替换:

  • 前端提交前把单引号替换为占位符,比如 value.replace(/'/g, '__QUOTE__')
  • 服务端接收到参数后再把占位符替换回单引号即可。

该方案仅适合临时应急,长期还是建议优先调整WAF规则,避免后续其他SQL注入特征字符串也被误拦截。


内容的提问来源于stack exchange,提问作者AntiMeta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:30:01