不能。宝塔WAF仅开启SQL注入规则无法有效防御真实攻击,因其依赖正则匹配而非语义分析,易被编码混淆、大小写嵌套等绕过;需确认WAF运行、保存规则、绑定站点,并优化关键字拦截与拦截响应策略。

宝塔WAF是否真能靠“开开关”防住SQL注入?
不能。单纯在宝塔WAF界面勾选“SQL注入”规则组,只覆盖了最表层的攻击载荷,比如明文 union select、sleep(1) 这类直白写法。但真实攻击中,绕过手法早已迭代到编码混淆、大小写嵌套、空格/注释符替换、逻辑运算符变形等维度,而默认规则对这些变体的识别率有限。WAF本质是正则匹配引擎,不是SQL解析器——它拦的是“像攻击”的字符串,不是“实际有害”的语义。
开启SQL关键字拦截前必须确认的三件事
很多用户点完“启用”就以为万事大吉,结果上线后仍被盲注打穿。真正起效的前提是:
- WAF服务本身已启动:在【软件商店】里确认
宝塔网站防火墙状态为“运行中”,而非“已安装”或“已停止” - 规则作用域正确:在【规则管理】→【SQL注入】页勾选规则后,必须点击右上角
保存规则,否则配置仅停留在内存未写入磁盘 - 站点绑定生效:全局规则默认不自动应用到所有站点,需进入【网站防护】页,对每个目标域名单独点击
设置并确认“启用此站点防护”已勾选
哪些SQL关键字值得优先拦截?别只盯着union和select
攻击者早就不硬刚 union select 了。更危险的是那些被忽略的“辅助型”关键字,它们常出现在布尔盲注、时间盲注或堆叠注入中,且匹配难度低、误报率小:
-
and/or:布尔盲注基础逻辑符,但WAF默认可能只拦截带空格的and,漏掉&&、||或无空格and1=1 -
substr/substring/mid:用于逐字提取数据库内容,常被用于绕过长度限制或编码检测 -
benchmark/sleep:时间盲注核心函数,但部分WAF规则只匹配sleep(,漏掉sleep%281%29或BENCHMARK(1000000,MD5(1)) - 注释符:
--+、#、/*是高频拦截项,但/**/(空注释)、/*!*/(MySQL条件注释)常被遗漏
拦截后返回什么状态码?这点直接影响攻击者判断
宝塔WAF默认拦截返回 403 Forbidden,这是最危险的配置。攻击者看到403,立刻知道“我触发了WAF”,进而转向更隐蔽的盲注路径;而如果返回 200 OK + 伪造的正常页面(如空白页或静态提示),反而能制造“无漏洞”假象,拖延探测节奏。修改方式在WAF【全局设置】→【自定义拦截响应】中调整 拦截状态码 和 响应内容。注意:不要设成 503 或 429,这类状态码自带“服务受限”语义,反而暴露防御存在。
真正难的不是打开拦截开关,而是持续验证规则是否覆盖了你业务中实际使用的SQL模式——比如你的登录接口会拼接 LIKE '%{keyword}%',那 % 和单引号就必须纳入白名单或做上下文感知过滤,否则合法搜索也会被误杀。


















