Redis不能直接拦截SQL注入,但可通过前置校验成为第一道过滤网:对缓存key做白名单校验、拒绝非法字符、空值缓存需严格控制、禁止以原始SQL为key、数据库查询必须用预处理语句。Redis 本身不解析 SQL,也不执行 SQL 查询,所以它**不能直接拦截 SQL 注入载荷**。但你可以在缓存层设计前置校验逻辑,把明显非法的输入在抵达数据库前就拦下来——关键不是让 Redis “防注入”,而是让它成为第一道过滤网。
常见错误是把原始 HTTP 参数直接拼进 key,比如:"user:" + user_id + ":profile"。如果 user_id 是 123' OR '1'='1,key 变成 user:123' OR '1'='1:profile,虽然 Redis 不会因此执行命令,但后续业务可能误判该 key 合法,跳过校验直接拼 SQL。
^[0-9]{1,12}$ 或强转为 long/int 再构造 key^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$
--、/*)、空格的 key,直接返回 400 或限流缓存穿透场景下,攻击者用大量不存在的 user_id 刷接口,如果你对每个都执行 SET user:abc:profile "" EX 60,等于帮对方把恶意请求固化进缓存,还浪费内存。
user:-1、user:select)直接拒绝,不写缓存、不查 DBSELECT、UNION、OR 的 key 模式如果你在 Redis 里看到大量形如 sql_cache:SELECT%20*%20FROM%20users%20WHERE%20name%3D'admin' 的 key,说明业务层正在用用户输入拼接完整 SQL 字符串再哈希——这等于把 SQL 注入 payload 直接送进缓存系统,风险极高。
user_id=123),而非查询语句#{}、JDBC 的 PreparedStatement),缓存层不参与 SQL 构造user_search:v1:md5("name=xxx&age=25"),且签名前先校验参数合法性get() 前那一行校验逻辑——它不复杂,但很容易被跳过。