不能。Sentinel限流无法防御SQL注入,因其只控制请求流量而不解析参数内容;SQL注入需在DAO层用参数化查询、ORM安全调用及数据库最小权限三重防护。

不能。Sentinel 限流无法防御 SQL 注入。
为什么 Sentinel 的流控对 SQL 注入无效
SQL 注入是应用层逻辑漏洞,本质是用户输入被拼进 SQL 语句执行;而 Sentinel 是流量治理组件,只管“请求来了多少、要不要拦”,不管“请求里写了什么”。它压根不解析请求体、不检查参数内容、不识别 ' OR '1'='1 这类恶意字符串。
常见误解是:只要 QPS 被限住,攻击者就扫不动了。但问题在于:
- 一次 SQL 注入攻击可能只需 1 个请求(比如
' UNION SELECT password FROM users --)就能拖库,限流拦不住单次高危请求 - 时间盲注(
AND SLEEP(5))或布尔盲注(AND LENGTH(database())>5)的 QPS 极低,完全在限流阈值内,Sentinel 视为“正常慢请求”放行 - 攻击者可把注入 payload 拆成多个低频请求,绕过 QPS/线程数规则,Sentinel 无从感知语义关联
真正该拦截 SQL 注入的位置和手段
防护必须落在数据进入数据库前的最后一环:SQL 执行环节本身。核心只有三条路,按优先级排列:
-
强制使用参数化查询:所有 DAO 层代码禁用字符串拼接,Java 用
PreparedStatement,Python 用cursor.execute("SELECT * FROM t WHERE id = %s", [user_id]),PHP 用 PDO 的prepare() -
ORM 框架安全调用:Spring Data JPA 的
findByUsername(String username)、MyBatis 的<select></select>标签带#{}占位符,都默认做预编译;但要避开${}直接拼接 -
数据库账号最小权限:应用连接数据库的账号禁止
DROP、CREATE、LOAD_FILE、EXECUTE等高危权限,即使注入成功,也最多读几张表
Sentinel 在 SQL 安全场景中唯一能起作用的点
它只能辅助发现异常行为模式,但不能替代防护:
- 配置
SystemRule限制整个应用的 CPU 使用率或 RT,防止慢查询(如SLEEP())拖垮服务——这是保命,不是防注入 - 用
@SentinelResource包裹关键 DAO 方法,配合blockHandler记录被限流的 SQL 日志,事后分析是否集中出现在某类参数上(比如大量含UNION的请求),作为入侵线索 - 如果用了 Nacos 持久化规则,可在 Dashboard 中观察某接口的
exceptionQps突增,结合日志查是否因注入导致 JDBC 异常(如MySQLSyntaxErrorException)
最易被忽略的一点:很多人给 Controller 层加了 @SentinelResource 就以为万事大吉,但 SQL 注入发生在 Service → DAO → JDBC 链路末端,Controller 限流再严,恶意 SQL 一样会抵达数据库。防御位置错,再多规则都是白搭。

















