LIKE-based SQL Injection
搜索功能通常使用 LIKE 语句,同样存在注入风险:
-- 原始查询
SELECT * FROM users WHERE username LIKE '%关键词%'
-- 注入后
SELECT * FROM users WHERE username LIKE '%' OR 1=1--%'
↑
返回所有用户!
返回所有用户:
' OR '1'='1
' OR 1=1--
UNION 注入窃取密码:
' UNION SELECT id,password,role FROM users--
窃取 secrets 表:
' UNION SELECT id,content,level FROM secrets--
等待输入...
等待搜索...
SELECT * FROM users WHERE username LIKE '%' OR '1'='1%'
↑
永远为真
返回所有记录
SELECT id, username, role FROM users WHERE username LIKE '%'
UNION SELECT id, password, role FROM users--%'
↑
窃取密码字段!
-- % 匹配任意字符
搜索: %
结果: 返回所有用户
-- _ 匹配单个字符
搜索: ____ (4个下划线)
结果: 返回用户名为4个字符的用户 (如 test, lisi)
搜索注入在实际应用中非常常见:
WHERE username LIKE ?,参数为 %keyword%% 和 _安全的实现:
// ✅ 参数化 + 转义通配符
const safeKeyword = keyword.replace(/%/g, '\\%').replace(/_/g, '\\_')
const sql = 'SELECT * FROM users WHERE username LIKE ?'
db.prepare(sql).all(`%${safeKeyword}%`)