SQL注入攻击长期位居Web安全威胁榜前列,攻击者通过在参数中拼接恶意SQL片段,试图绕过身份认证或直接拖库。WAF(Web应用防火墙)作为边界防护的重要手段,依靠一套持续演进的拦截规则识别并阻断这类请求。理解这些规则的实现方式,有助于我们在业务侧写出更安全的代码,也能在WAF误报时快速定位原因。

基于正则匹配的静态规则机制
最常见的WAF拦截手段是正则表达式匹配。安全厂商会维护一份特征库,把已知攻击语句抽象成模式。例如unions+select、ors+1s*=s*1、sleeps*(s*d+s*)等都会被写成正则,在请求到达后端前做全文扫描。这种规则响应极快,对自动化工具产生的标准攻击payload命中率很高。
不过正则规则有明显的短板。攻击者可以使用大小写混写、内联注释、换行拆分等方式变形。比如UNION/**/SELECT就能绕过只认空格的写法;用0x73656c656374十六进制代替明文字符串也能逃过简单匹配。因此现代WAF很少单靠正则,而是把它作为第一道粗筛,命中后交给后续模块细看。
在自研WAF时,正则要注意避免灾难性回溯。下面这段PHP示例展示了一个简单但安全的匹配思路,先转义再判断危险词,而不是写复杂嵌套分组:
<?php
function waf_check($input) {
// 移除注释干扰
$clean = preg_replace('//*.*?*//s', '', $input);
$clean = preg_replace('/--.*$/m', '', $clean);
// 基础正则特征
$rules = array(
'/unions+select/i',
'/borbs+d+s*=s*d+/i',
'/sleeps*(s*d+s*)/i'
);
foreach ($rules as $r) {
if (preg_match($r, $clean)) {
return false;
}
}
return true;
}
?>
词法分析与请求参数结构化检测
比正则更进一步的是词法分析。WAF把每个参数值当作一段待编译的SQL片段,用轻量词法器拆分成令牌(token),统计关键字、运算符和注释符的分布。正常搜索词里很少同时出现select和from,而如果参数中出现括号嵌套调用version()且伴随concat,风险评分就会拉高。
这种方法的优势是能识别变形。例如攻击者用sele/**/ct,正则可能漏掉,但词法器先去注释再切词,依然能得到select令牌。部分开源WAF如ModSecurity的CRS规则集就大量采用变量计数,比如ARG_NAME匹配特殊字符数量,超过阈值就拦截。
下面是用Python模拟令牌统计的简化逻辑,真实产品会结合上下文判断参数是否进入SQL语句拼接点:
import re
def token_risk(value):
# 去内联注释
v = re.sub(r'/*.*?*/', '', value)
tokens = re.findall(r'[a-zA-Z_]+|[d]+|[^a-zA-Z0-9_]', v)
danger_kw = {'select','union','insert','drop','update','delete'}
score = 0
for t in tokens:
if t.lower() in danger_kw:
score += 2
if t in ('(',')','--','#','/*'):
score += 1
return score
print(token_risk('id=1 union select name from user--'))
语义还原与动态行为规则
最高级的拦截来自语义分析。WAF借助SQL解析器,把参数回填到预设的SQL模板,看最终语句是否改变了原查询语义。比如后端代码是select * from t where id=$_GET['id'],正常传1得到单行查询;若传入1 or 1=1,解析树会多出恒真条件,WAF据此阻断而非只看字符。
语义规则能防住绝大多数绕过,但计算开销大,通常只针对高风险接口开启。另外,WAF还会结合行为规则:同一IP短时间大量试探不同payload,即使单次未命中也触发临时封禁。下表对比了三类规则的特点:
| 规则类型 | 检测速度 | 绕过难度 | 误报可能 |
|---|---|---|---|
| 正则匹配 | 极快 | 低 | 中 |
| 词法分析 | 较快 | 中 | 较低 |
| 语义还原 | 慢 | 高 | 低 |
实际运维中,建议开启正则加词法双引擎,核心接口叠加语义模块。同时把WAF日志接入SIEM,定期抽查拦截项,防止正常报表查询被误杀。开发侧仍须使用预处理语句,WAF只是纵深防御的一环,不能替代代码层参数绑定。
SQL_injectionWAF拦截规则修改时间:2026-08-18 18:02:43