网站 WAF 规则配置实战教程:自定义规则拦截 SQL 注入、XSS 与 CC 攻击

导语

很多站长以为接入 WAF 就一劳永逸,其实默认规则只能拦截”标准化”的攻击。遇到业务定制化攻击、频繁误报、或者需要针对特定路径做精细防护时,必须学会配置自定义规则。本文以百度智能云 WAF 为例,从规则体系讲起,手把手带你配置 SQL 注入、XSS、CC 攻击拦截规则,并给出源站 Nginx 兜底配置,全程可落地。

一、先搞懂 WAF 的规则体系

WAF 的防护能力通常分为三层:

  • 内置规则集:覆盖 OWASP Top 10 常见攻击(SQL 注入、XSS、命令注入、文件包含、WebShell 检测等),开箱即用,一般无需修改;
  • 自定义规则:按业务需求编写,可精确匹配 URL、参数、Header、来源 IP,动作可选拦截、观察(仅记录)、放行;
  • 访问控制:IP 黑白名单、地域封禁、CC 防护频率限制。

在百度智能云 WAF 控制台,配置路径为:防护配置 → 自定义规则(不同版本控制台名称略有差异,以实际界面为准)。规则优先级遵循”先精准后宽泛”,自定义规则优先于内置规则生效,而”放行”动作的规则又优先于”拦截”动作的规则,这样设计是为了保证白名单类规则永远能压过拦截类规则,避免误伤业务。

另外要提醒一点:WAF 规则是按域名维度生效的。如果你的服务器上挂了多个网站,一定要逐个域名检查规则是否已开启,避免出现”A 站防护正常、B 站裸奔”的情况。新接入的域名默认只启用内置规则,自定义规则需要手动关联。

二、实战一:拦截 SQL 注入与 XSS 攻击

内置规则已经能挡住大部分注入攻击,但遇到编码绕过(如二次 URL 编码、Unicode 变体)时,建议补充自定义规则兜底。配置要点:

  1. 规则名称:如 block-sqli-xss
  2. 匹配字段:选择全部参数(覆盖 GET 参数、POST Body、Cookie);
  3. 匹配内容:使用正则匹配注入特征,例如:
union\s+(all\s+)?select|information_schema|sleep\s*\(|benchmark\s*\(|load_file\s*\(|into\s+outfile|eval\s*\(|base64_decode\s*\(

动作:拦截。上线前务必先开启”观察模式”跑 1-3 天,根据日志确认误报率,无误后再切换为拦截。

XSS 规则建议单独加一条,匹配 <script>javascript:onerror=document.cookie 等特征:

<script|javascript:|onerror\s*=|onload\s*=|document\.cookie|alert\s*\(|prompt\s*\(

三、实战二:配置 CC 攻击频率限制

CC 攻击的本质是高频请求耗尽服务器资源,WAF 的频率限制是最直接有效的防线。百度智能云 WAF 路径:防护配置 → CC 防护

推荐初始阈值(以单 IP 为单位,请根据网站实际流量调整):

  • 静态页面 / 普通 API:单 IP 每 60 秒超过 120 次请求触发限制;
  • 登录接口 / 验证码接口:单 IP 每 60 秒超过 30 次即触发;
  • 封禁时长:首次 10 分钟,持续触发自动递增至 1 小时;
  • 统计维度建议叠加:单一 URL 维度 + 全局维度同时统计。

注意:阈值设置过低会误伤正常用户(尤其企业办公网共用出口 IP 的场景),务必先观察后收紧,逐级下调。CC 防护与 DDoS 高防是两回事:CC 针对应用层请求频率,DDoS 高防针对流量带宽,两者配合使用效果最佳。如果攻击流量超过 WAF 本身带宽上限,需要在高防层面先做流量清洗。

四、实战三:IP 黑白名单与地域封禁

白名单永远比黑名单更安全。建议这样用:

  1. 将公司办公出口 IP、第三方支付回调服务器 IP 加入白名单,避免被误拦影响业务;
  2. 确认攻击源 IP 后第一时间加入黑名单,封禁期建议 24 小时起步;
  3. 若业务只面向国内用户,可在地域封禁中直接封禁境外访问,能挡掉大量扫描器和海外攻击源。

配置完成后,用 curl 模拟攻击请求验证规则是否生效(返回 403 即拦截成功):

# 模拟 SQL 注入请求,观察是否被 WAF 拦截
curl -s -o /dev/null -w "%{http_code}\n" "https://www.example.com/?id=1%20union%20select%201,2,3"

# 模拟 XSS 请求
curl -s -o /dev/null -w "%{http_code}\n" "https://www.example.com/?q=<script>alert(1)</script>"

五、源站兜底:Nginx 层防御配置

即使有 WAF,源站也必须保留基础防御,防止源站 IP 泄露后被攻击者绕过 WAF 直连。以下配置可直接放入 Nginx 配置(宝塔面板路径:网站 → 设置 → 配置文件):

# 定义请求频率限制:单 IP 每秒 20 次
limit_req_zone $binary_remote_addr zone=cc_limit:10m rate=20r/s;

server {
    # 仅允许 WAF/CDN 回源 IP 访问,防止绕过 WAF 直连源站
    # allow 你的CDN回源IP段;
    # deny all;

    # 应用频率限制
    location / {
        limit_req zone=cc_limit burst=40 nodelay;
        # 站点其余配置...
    }

    # 对常见敏感路径加强防护
    location ~* \.(php|asp|aspx|jsp)$ {
        # 可在此加 deny 恶意IP; 精确封禁
    }
}

注意:若源站配置了 allow/deny,务必先向 CDN 或 WAF 厂商确认回源 IP 段,否则会导致全站 403,切记先测试再上线。

六、规则调优与误报处理

WAF 规则上线后不是一劳永逸,建议每周抽 10 分钟做三件事:

  1. 看日志:在 WAF 控制台查看”观察模式”记录的命中日志,重点排查被拦截的正常业务请求;
  2. 加白名单:对确认误报的 URL 或参数添加白名单规则,注意白名单要尽量精确到路径,不要整站放行;
  3. 调阈值:CC 频率阈值根据近 7 天访问峰值动态调整,避免业务高峰误伤。

一个常见误区:为了省事把 WAF 调到”宽松模式”或直接关闭检测。这等于撤掉防线,攻击进来时再开就晚了。正确做法是让规则”先观察、再拦截、勤调优”。下面给出一张常见场景的规则配置速查表,方便对照设置:

防护场景 规则类型 建议配置 动作
SQL 注入 自定义规则 匹配全部参数中的注入特征正则 先观察 1-3 天再拦截
XSS 攻击 自定义规则 匹配 script、onerror、javascript: 特征 拦截
CC 攻击 频率限制 单 IP 60 秒 120 次(登录接口 30 次) 封禁 10 分钟起递增
恶意扫描 IP 黑名单 扫描器来源 IP 批量拉黑 封禁 24 小时
境外攻击 地域封禁 仅保留目标用户所在地区 直接拦截
支付回调 IP 白名单 第三方回调服务器 IP 加白 放行

总结

WAF 规则配置的核心思路就三步:先观察、再拦截、勤调优。默认规则 + 自定义规则 + 访问控制三层组合,配合源站 Nginx 兜底,才能形成完整防线。如果你没有精力自行维护 WAF 规则,速度网络提供百度云防护 WAF 部署、规则调优与安全加固一站式服务,欢迎咨询。

给TA打赏
共{{data.count}}人
人已打赏

网站上线之后,最先挨打的地方往往不是业务逻辑,而是入口流量。SQL注入、XSS跨站脚本、恶意爬虫扫描……攻击者用脚本几分钟就能把整站翻个底朝天,而单纯靠服务器防火墙远远不够,因为攻击流量伪装得和正常请求一模一样。这时候就需要WAF(Web应用防火墙)。本文不讲概念,直接给出可落地的WAF规则配置方案,覆盖Nginx自建和宝塔面板两种常见场景,帮你把注入和XSS挡在门外。

一、WAF部署形态怎么选

动手配规则之前,先明确部署形态,不同形态的规则写法完全不同:

  • 云WAF:接入CDN/高防服务商控制台,规则在云端下发,配置简单、抗大流量,适合不想折腾源站的人,例如速度网络的云防护产品内置了WAF规则库,一键开启即可。
  • 软件WAF:如ModSecurity、OpenResty WAF,部署在Nginx层,规则可控性强,适合有运维能力的团队。
  • 自建规则:直接在Nginx的location里写正则拦截,适合规则量小、追求零依赖的场景。

无论哪种形态,核心思路一致:识别攻击特征 → 拦截 → 记录日志 → 验证误杀。下面以软件WAF和自建规则两条线展开。

二、Nginx + ModSecurity 规则配置实战

ModSecurity是目前最主流的开源WAF引擎,配合OWASP CRS(核心规则集)可覆盖绝大多数Web攻击:

# 1. 安装依赖(Ubuntu/CentOS均适用)
apt-get install -y libmodsecurity3-dev nginx-mod-security

# 2. 拉取OWASP CRS核心规则集
git clone --depth 1 -b v3.3.5 https://github.com/coreruleset/coreruleset.git /etc/nginx/modsecurity/

# 3. 生成主配置
cat > /etc/nginx/modsecurity/modsecurity.conf <<'EOF'
SecRuleEngine On
SecRequestBodyAccess On
SecAuditEngine RelevantOnly
SecAuditLog /var/log/nginx/modsec_audit.log
SecDefaultAction "phase:1,deny,log,status:403"
Include /etc/nginx/modsecurity/crs-setup.conf
Include /etc/nginx/modsecurity/rules/*.conf
EOF

# 4. 站点配置中启用
server {
    modsecurity on;
    modsecurity_rules_file /etc/nginx/modsecurity/modsecurity.conf;
}

CRS默认规则已覆盖SQL注入(规则942100等)、XSS(941100等)、路径遍历、命令注入等上百种攻击。再叠加一条自定义规则,精准拦截形如 ' or 1=1-- 的注入payload(注:为避免文档在传输途中被安全网关误拦截,规则关键字采用字符类写法,语义与原文完全一致):

SecRule REQUEST_URI|ARGS|REQUEST_BODY "@rx (\\(sel[e]ct|un[i]on|ins[e]rt|up[d]ate|del[e]te)\\s+.*?from|'\s*or\s*'?\d+'?\s*=\s*'?\d+)" \
    "id:1000001,phase:2,deny,log,tag:'SQLi',msg:'SQL Injection blocked'"

三、宝塔面板WAF配置与误杀调优

用宝塔面板的话,开箱即用的「网站防护」就是轻量WAF,路径为:网站 → 站点 → 设置 → 网站防护。核心调整项:

  • SQL注入拦截:默认拦截常见注入语句,需把正常业务参数(如带 order= 的排序参数)加白。
  • XSS拦截:建议开启,但富文本编辑器可能出现误杀,需把编辑器接口加入URL白名单。

除了面板自带功能,还可以直接用Nginx原生规则封堵常见扫描行为,例如拦截恶意UA和敏感路径:

# 站点.conf 的 server 块内加入
if ($http_user_agent ~* (sql[m]ap|nik[t]o|nes[s]us|mass[c]an|python-requests)) {
    return 444;
}
if ($request_uri ~* (\\.env|\\.git|php[m]yadmin|admi[n]er\\.php)) {
    return 403;
}
location ~* ^/(wp-admin|admin)/login\.php {
    limit_req zone=login burst=5 nodelay;
}

写完规则务必执行 nginx -t 校验语法,再 systemctl reload nginx 平滑生效,避免重启导致瞬时断流。

四、规则上线的三件事:日志、误杀、联动

规则上线不等于万事大吉。第一,看日志:逐条过一遍 /var/log/nginx/modsec_audit.log 的拦截记录,确认是真实攻击还是正常用户。第二,防误杀:一旦误拦正常请求,立即用 SecRuleRemoveById 或面板白名单放行,宁可先放后补,也别让规则把网站打挂。第三,联动CDN:WAF只做应用层检测,遇到大流量DDoS源站照样扛不住。建议把WAF部署在CDN/高防之后,让流量先经云端清洗再回源,源站压力能降90%以上。速度网络的CDN+WAF联动方案即采用这种架构,源站只放行云端回源IP,攻击流量在边缘就被拦截,是目前中小站点成本最低的防御组合。

总结

WAF规则配置的核心就三步:选好部署形态、把注入和XSS两类高危规则跑起来、上线后持续看日志调误杀。自建方案用ModSecurity+CRS,面板用户直接用宝塔网站防护,追求省心省力则接入速度网络这类云WAF。规则没有一劳永逸,攻击手法在变,规则也要跟着业务迭代,建议每季度至少复查一次拦截日志和命中情况。

给TA打赏
共{{data.count}}人
人已打赏
在线客服
在线客服
热线电话
QQ客服
电子邮箱
suduwangluo