前端会遭遇SQL注入吗?我写的搜索功能是不是有风险?

诸葛怡萱 阅读 65

我在做一个商品搜索功能,用户输入关键词后通过 fetch 发请求到后端接口。后端是用 PHP 写的,直接拼接 SQL 查询,比如:

$sql = "SELECT * FROM products WHERE name LIKE '%" . $_GET['q'] . "%'";

同事说这样会有 SQL 注入,但我觉得前端只是发个请求,应该没问题吧?是不是只要后端处理好就行?可我又听说现在有些攻击能绕过前端验证,有点懵……

我来解答 赞 15 收藏
二维码
手机扫码查看
2 条解答
Air-玉飞
你同事说得对,这确实有SQL注入风险。

不过先澄清一个概念:SQL注入本质上是后端漏洞,不是前端的问题。前端发请求传什么数据是前端的自由,攻击者完全可以不通过你的前端页面,直接用curl或者Postman构造恶意请求发到后端。所以你纠结"前端是否会被注入"这个问题本身方向就错了——真正的问题是后端代码有没有做好防护。

你写的这段代码:

$sql = "SELECT * FROM products WHERE name LIKE '%" . $_GET['q'] . "%'";

用户输入 q=' or 1=1 -- 就能把所有商品数据拖走,输入 q='; DROP TABLE products; -- 搞不好能删掉整张表。攻击者不需要绕过你的前端验证,直接在请求里改参数就行。

PHP正确的做法是用预处理语句:

// 方法1:PDO预处理(推荐)
$pdo = new PDO('mysql:host=localhost;dbname=shop', 'root', 'password');
$stmt = $pdo->prepare("SELECT * FROM products WHERE name LIKE :keyword");
$stmt->execute(['keyword' => '%' . $_GET['q'] . '%']);
$results = $stmt->fetchAll();

// 方法2:mysqli预处理
$conn = new mysqli("localhost", "root", "password", "shop");
$stmt = $conn->prepare("SELECT * FROM products WHERE name LIKE ?");
$search = "%" . $_GET['q'] . "%";
$stmt->bind_param("s", $search);
$stmt->execute();


用预处理语句的话,传入的参数只会当作字符串处理,不会被解释成SQL代码。

至于你说的"绕过前端验证",其实就是一个意思——攻击者根本不鸟你前端怎么验证,直接构造请求就行。所以后端永远不要信任前端传来的任何数据,做参数化查询是基本功,没得商量。
点赞 1
2026-03-14 12:05
子涵
子涵 Lv1
这确实是个严重的SQL注入风险,前端并不能保护你,后端这么写简直就是给黑客开大门。让我解释清楚:

1. 前端验证就是个装饰品,攻击者完全可以绕过浏览器直接发请求,甚至用curl这类工具手动构造恶意参数。

2. 你同事说的对,直接拼接SQL字符串非常危险。比如用户输入' OR '1'='1,你的SQL就变成永远为真,会泄露整张表数据。

更好的写法是用预处理语句,PHP可以这样改:

$stmt = $pdo->prepare("SELECT * FROM products WHERE name LIKE ?");
$stmt->execute(["%" . $_GET['q'] . "%"]);


3. 额外建议:前端可以加个简单的输入校验(比如限制特殊字符),但记住这只是为了提升用户体验,绝不能替代后端防护。

4. 最惨的情况:如果你们项目里到处都是这种拼接SQL,建议准备好通宵加班改代码...我经历过,简直噩梦。
点赞
2026-03-06 12:02