前端会遭遇SQL注入吗?我写的搜索功能是不是有风险? 诸葛怡萱 提问于 2026-03-06 11:53:18 阅读 65 前端 我在做一个商品搜索功能,用户输入关键词后通过 fetch 发请求到后端接口。后端是用 PHP 写的,直接拼接 SQL 查询,比如: $sql = "SELECT * FROM products WHERE name LIKE '%" . $_GET['q'] . "%'"; 同事说这样会有 SQL 注入,但我觉得前端只是发个请求,应该没问题吧?是不是只要后端处理好就行?可我又听说现在有些攻击能绕过前端验证,有点懵…… SQL注入前端安全 我来解答 赞 15 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 Air-玉飞 Lv1 你同事说得对,这确实有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 加载更多 相关推荐 2 回答 62 浏览 在前端用模板字符串拼接SQL时,怎么防OWASP Top 10的注入漏洞? 我在做用户搜索功能时,后端让前端传原始搜索词,用模板字符串拼接SQL查询。但测试时发现这属于A03注入漏洞。虽然改用了参数化查询,但后端报错说参数顺序不对... 具体场景是用户输入框内容拼接到"SEL... 佳沫的笔记 安全 2026-01-26 15:59:27 1 回答 43 浏览 前端如何防止SQL注入时意外暴露敏感信息? 我在做用户登录功能时,后端用了参数化查询防SQL注入,但前端错误提示写得太详细,比如直接显示“用户名或密码错误”,担心被用来暴力探测账户。想隐藏具体错误,但又不能让用户完全不知道哪里出错,这该怎么平衡... Newb.培聪 安全 2026-03-10 20:42:24 2 回答 36 浏览 前端传数字ID到后端,做类型检查能防SQL注入吗? 我在写一个用户信息查询功能,前端传了个用户ID给后端接口。听说只要确保这个ID是数字就能防止SQL注入,是真的吗? 我试过在前端用typeof id === 'number'判断,但发现用户还是可以通... a'ゞ翌菡 安全 2026-03-03 20:25:18 1 回答 43 浏览 前端请求后端接口时,错误信息会不会导致SQL注入风险? 我最近在做登录功能,后端用的是Node.js + MySQL。之前听说如果错误信息暴露太多,可能会被用来做SQL注入攻击。我现在catch到数据库错误就直接把err.message返回给前端了,这样是... Des.红辰 安全 2026-03-27 18:08:27 2 回答 33 浏览 前端用 Prepared Statement 能防 SQL 注入吗? 我最近在学安全防护,看到说用 Prepared Statement 可以防止 SQL 注入。但我是在写前端代码(比如用 fetch 发请求),那我在前端拼 SQL 字符串然后发给后端,是不是照样会被注... 东方晓萌 安全 2026-02-27 04:52:17 2 回答 58 浏览 在Sequelize中使用findOrCreate时如何防止SQL注入? 最近在用Sequelize做用户注册功能时,发现直接拼接查询条件可能会有SQL注入风险。比如这样写: User.findOrCreate({ where: { username: req.body.u... 夏侯梦森 安全 2026-02-11 10:40:35 1 回答 51 浏览 SQLMap测试时怎么判断是否存在SQL注入? 我用 SQLMap 测试一个登录接口,但返回结果不太确定是不是真的有注入点。比如运行 sqlmap -u "http://example.com/login" --data="username=adm... 司空俊鑫 安全 2026-03-25 14:47:24 2 回答 97 浏览 TypeORM里用Raw写SQL会有注入风险吗? 我最近在用TypeORM的Raw函数拼接查询条件,但担心这样会不会有SQL注入漏洞?比如下面这段代码: const users = await getRepository(User) .find({ ... 一家淼 安全 2026-03-06 00:28:21 2 回答 65 浏览 React里用预编译语句防SQL注入时参数化失败怎么办? 我在React组件里用Axios调用后端查询接口,参数直接拼接到SQL字符串里了,担心SQL注入风险。按照教程改成预编译语句后,参数化一直失败,控制台报错说"参数位置无效"。 这是我的代码片段: //... UX子武 安全 2026-02-12 22:12:30 2 回答 66 浏览 Vue过滤特殊字符后为什么SQL注入还能被绕过? 在Vue项目里处理搜索框输入时,我给后端API加了引号过滤,但测试SQL注入时发现还是能绕过... 具体场景是用户输入搜索词会拼接SQL语句,我在前端用了正则过滤单双引号,但输入" OR 1=1--%... 慕容喜静 安全 2026-02-12 14:05:32
不过先澄清一个概念:SQL注入本质上是后端漏洞,不是前端的问题。前端发请求传什么数据是前端的自由,攻击者完全可以不通过你的前端页面,直接用curl或者Postman构造恶意请求发到后端。所以你纠结"前端是否会被注入"这个问题本身方向就错了——真正的问题是后端代码有没有做好防护。
你写的这段代码:
$sql = "SELECT * FROM products WHERE name LIKE '%" . $_GET['q'] . "%'";
用户输入
q=' or 1=1 --就能把所有商品数据拖走,输入q='; DROP TABLE products; --搞不好能删掉整张表。攻击者不需要绕过你的前端验证,直接在请求里改参数就行。PHP正确的做法是用预处理语句:
用预处理语句的话,传入的参数只会当作字符串处理,不会被解释成SQL代码。
至于你说的"绕过前端验证",其实就是一个意思——攻击者根本不鸟你前端怎么验证,直接构造请求就行。所以后端永远不要信任前端传来的任何数据,做参数化查询是基本功,没得商量。
1. 前端验证就是个装饰品,攻击者完全可以绕过浏览器直接发请求,甚至用curl这类工具手动构造恶意参数。
2. 你同事说的对,直接拼接SQL字符串非常危险。比如用户输入
' OR '1'='1,你的SQL就变成永远为真,会泄露整张表数据。更好的写法是用预处理语句,PHP可以这样改:
3. 额外建议:前端可以加个简单的输入校验(比如限制特殊字符),但记住这只是为了提升用户体验,绝不能替代后端防护。
4. 最惨的情况:如果你们项目里到处都是这种拼接SQL,建议准备好通宵加班改代码...我经历过,简直噩梦。