搜索框是网站常见功能,但如果后端直接把用户输入拼进SQL语句,攻击者可构造特殊字符串篡改查询逻辑,造成数据泄露或删除。要修复这类SQL注入风险,常用手段是对特殊字符转义,或改用数据库全文索引。

一、SQL注入在搜索框中的成因
典型漏洞代码把关键词直接拼接,如以下PHP示例:
<?php $keyword = $_GET['q']; // 危险写法:直接拼接 $sql = "SELECT * FROM articles WHERE title LIKE '%" . $keyword . "%'"; // 攻击者输入 q=1%' OR '1'='1 可返回全部数据 ?>
这种写法未处理单引号、百分号等字符,导致查询条件被改变。
二、对特殊字符进行转义
使用数据库提供的转义函数,可把用户输入中的特殊字符变为安全文本。以MySQLi为例:
<?php
$mysqli = new mysqli("127.0.0.1", "user", "pass", "db");
$keyword = $mysqli->real_escape_string($_GET['q']);
$sql = "SELECT * FROM articles WHERE title LIKE '%" . $keyword . "%'";
?>
若使用PDO,推荐预处理语句,从根本上隔离代码与数据:
<?php
$pdo = new PDO("mysql:host=127.0.0.1;dbname=db", "user", "pass");
$stmt = $pdo->prepare("SELECT * FROM articles WHERE title LIKE ?");
$stmt->execute(['%' . $_GET['q'] . '%']);
?>
常见需转义字符
- 单引号 <code>'</code> 转为 <code>'</code>
- 双引号 <code>"</code> 视数据库而定
- 反斜杠 <code></code> 转为 <code>\</code>
- 百分号 <code>%</code> 在LIKE中需转义为 <code>%</code>
三、使用全文索引替代模糊查询
当数据量大时,LIKE '%关键词%' 无法用普通索引,性能差。可建立全文索引并使用MATCH AGAINST语法。
建立全文索引
ALTER TABLE articles ADD FULLTEXT INDEX ft_title (title);
安全查询写法
SELECT * FROM articles
WHERE MATCH(title) AGAINST('安全搜索' IN NATURAL LANGUAGE MODE);
全文索引由数据库解析词语,不拼接字符串,天然避免注入,且支持中文需配置ngram分词器。
四、方案对比
| 方式 | 安全性 | 性能 | 适用场景 |
|---|---|---|---|
| 字符转义 | 较高 | 一般 | 简单搜索、小表 |
| 预处理语句 | 最高 | 一般 | 所有拼接场景 |
| 全文索引 | 高 | 优秀 | 文本检索、大表 |
五、总结建议
修复搜索框注入首选预处理语句,它让转义由驱动完成。若搜索体验要求高,用全文索引替换LIKE。两者结合可兼顾安全与效率。上线前可用扫描工具验证,确保无未转义入口。
SQL_injection字符转义full_text_index修改时间:2026-07-29 10:21:21