naxsi需在location块中显式启用secrulesenabled、开启secrequestbodyaccess并配对有效deniedurl,否则无法拦截post中的'or 1=1等sql注入。

Naxsi 本身不“拦截非法字符”,它拦截的是符合攻击语义的请求模式;直接用 naxsi_core.rules 开箱即用就能防基础 SQL 注入,但必须正确启用、配对 DeniedUrl,且不能漏掉 POST body 的检查。
为什么刚配完 naxsi 却没拦住 ' or 1=1?
常见错误是只加了 include naxsi_core.rules,却没在 location 块里启用规则引擎。Naxsi 的规则默认是“学习模式”(SecRulesDisabled),不 BLOCK 任何东西。
- 必须显式写
SecRulesEnabled;才会真正拦截 -
DeniedUrl路径必须存在且可访问,否则请求会被静默丢弃或返回 500 - 如果后端是 POST 提交表单,
$args拿不到参数值——Naxsi 默认不解析 request body,需额外配置SecRequestBodyAccess On; - 别把
SecRulesEnabled写在http或server级,它只在location内生效
如何让 naxsi 正确处理 POST 请求中的 SQL 注入?
Naxsi 对 POST 数据的检测依赖两个前提:body 解析开启 + 规则匹配路径覆盖。默认它只检查 URI 和 headers,$request_body 是空的。
- 在对应
location块顶部加SecRequestBodyAccess On; - 确保
client_max_body_size足够大(如10m),否则大 body 会被截断,规则失效 - 确认
naxsi_core.rules中的$SQL变量已定义(它包含'、--、union select等多级权重规则) - 不要手动重写
$SQL权重阈值,先用默认的CheckRule "$SQL >= 8" BLOCK;,调优阶段再改
哪些地方最容易配错导致 naxsi 形同虚设?
最隐蔽的问题不是规则写错,而是上下文缺失或路径错位。
-
include /path/to/naxsi_core.rules;必须放在http{}块内,且要在所有server{}之前——放错位置会导致变量未定义 -
DeniedUrl "/RequestDenied"对应的location /RequestDenied必须和启用规则的location在同一个server块里,跨 server 不生效 - 如果你用了
proxy_pass,Naxsi 规则必须写在 proxy 所在的location,而不是 upstream 定义处 - 日志里出现
naxsi: learning mode表示仍处于白名单模式,不是没触发,是压根没开 BLOCK
真正起效的关键不在规则多复杂,而在 SecRulesEnabled 是否落在正确的 location、SecRequestBodyAccess 是否打开、以及 DeniedUrl 是否能被 Nginx 路由到——这三处任一缺失,naxsi 就只是个哑巴模块。











