唯一可靠且可落地的sql注入检测方式是nginx ingress controller+modsecurity,需启用modsecurity-rule-engine并用modsecurity-snippet注入规则;istio等不解析请求体、无法可靠拦截sqli。

在 Kubernetes Ingress 层做 SQL 注入检测,唯一可靠且可落地的方式是:用 NGINX Ingress Controller + ModSecurity 规则引擎,配合 nginx.ingress.kubernetes.io/modsecurity-snippet 注入自定义规则。Istio、Traefik 或原生 Kubernetes Service/Ingress API 本身不支持内容级 SQLi 检测。
为什么不能依赖 Istio 或 VirtualService 做 SQLi 拦截
Istio 的 Envoy 数据面默认不解析请求体(application/x-www-form-urlencoded、application/json),也不执行正则匹配或语法分析。你无法在 VirtualService 的 match.uri 或 headers 中可靠捕获 ' OR '1'='1 这类 payload——攻击者只需 URL 编码、大小写混用、插入 /* */ 注释就能绕过。
-
AuthorizationPolicy只校验 JWT,不管请求 body -
PeerAuthentication只管 mTLS,不触碰 payload - WasmPlugin 虽可加载 SQLi 检测模块,但需自行实现 body 解析、参数提取、规则匹配,且不支持 JSON 自动解析,规则硬编码、无法热更新,实测增加 0.5–2ms 延迟
NGINX Ingress + ModSecurity 是当前最实用的方案
NGINX Ingress Controller(v1.10+)内置 ModSecurity v3 支持,能真正解析 HTTP 请求体并执行 OWASP CRS 风格规则。关键在于启用并注入规则,而非依赖默认配置。
- 必须显式开启:
nginx.ingress.kubernetes.io/modsecurity-rule-engine: "On"(默认是Off) - 单条规则可用
modsecurity-snippet直接写入,例如检测常见 UNION SELECT 模式:nginx.ingress.kubernetes.io/modsecurity-snippet: | SecRule ARGS "@rx (?i)union\s+select" "id:101,deny,status:403,msg:'SQL Injection: UNION SELECT detected'"
- 对 JSON body,需额外启用
SecRequestBodyAccess On并指定SecRequestBodyType application/json,否则 ModSecurity 不解析 JSON 字段 - 上线初期务必先设为
DetectionOnly,观察误报率;确认无误后再切到On
规则编写与绕过规避要点
简单匹配字符串极易被绕过。真实生产环境需组合多层防御逻辑,不能只靠一条正则。
- 避免只匹配
SELECT:攻击者用SeLeCt、%53%45%4c%45%43%54(URL 编码)、SEL/**/ECT即可逃逸 - 应覆盖常见变体:
UNION.*?SELECT、EXEC.*?sp_executesql、'\s*OR\s*'\d+'\s*=\s*'\d+'、;\s*DROP\s+TABLE - 优先检测 query string 和 form-data;JSON 需手动启用解析且性能开销更大
- 敏感路径(如
/api/login、/search)建议单独加严规则,非敏感静态资源路径可跳过
白名单与例外处理的实际限制
nginx.ingress.kubernetes.io/whitelist-source-range 看似能“放行内网”,但它只是 nginx 层的 IP 访问控制,不是 WAF 白名单——它不豁免 SQLi 检测逻辑,只控制是否允许连接进来。真要跳过检测,得用 ModSecurity 的 SecRuleRemoveById 或按路径禁用规则引擎,但会带来安全盲区。
更稳妥的做法是:对已知可信接口(如内部健康检查 /healthz),在 Ingress annotation 中单独关闭 ModSecurity:
nginx.ingress.kubernetes.io/modsecurity-rule-engine: "Off",而不是依赖网段白名单。
真正的难点不在写规则,而在于平衡检出率与误报率——每条规则都要在测试环境用 SQLMap 跑一遍,再结合真实业务流量日志调优。没有“开箱即用”的安全,只有持续验证的防线。











