在前端用模板字符串拼接SQL时,怎么防OWASP Top 10的注入漏洞?

佳沫的笔记 阅读 36

我在做用户搜索功能时,后端让前端传原始搜索词,用模板字符串拼接SQL查询。但测试时发现这属于A03注入漏洞。虽然改用了参数化查询,但后端报错说参数顺序不对…

具体场景是用户输入框内容拼接到”SELECT * FROM users WHERE name LIKE ‘%${keyword}%'”。现在尝试用预处理语句后,出现”参数类型不匹配”的错误,应该怎么改?

另外OWASP说前端也要做输入验证,但正则过滤会不会影响搜索体验?有没有更好的防范方法?

[[ANSWER]]
[[TITLE]]
如何在前端有效防范OWASP Top 10中的A03 2023-注入漏洞?

[[CONTENT]]

在开发用户搜索功能时,我遇到了注入漏洞的问题。当用户输入特殊字符时,后端用模板字符串拼接SQL导致查询失效。虽然尝试改用参数化查询,但出现”参数位置错误”,具体代码是这样的:

// 前端传参示例
fetch('/search', {
  method: 'POST',
  body: JSON.stringify({ query: `'%${userInput}%
})
})
</code></code></pre>

<p>后端用Node.js处理时,参数化代码:</p>

<pre class="pure-highlightjs line-numbers"><code class="language-javascript"><code class="language-javascript">// 错误写法示例
const sql = 'SELECT * FROM users WHERE name LIKE ?';
db.query(sql, [

%${req.body.query}%`]); // 参数未正确隔离

这种情况下应该如何正确实现参数化查询?前端需要做哪些输入验证?是否需要在前后端同时处理才能完全防范注入攻击?

我来解答 赞 6 收藏
二维码
手机扫码查看
2 条解答
司马雨婷
你这问题属于典型的 SQL 注入防护没做好,前后端都没到位。先说重点:

**后端参数化查询写错了!**

你这段代码:
db.query(sql, [%${req.body.query}%]);


这根本不是参数化查询的写法。参数化是把变量传进去让数据库驱动处理,不是你自己拼字符串再塞进去。应该是这样:

const sql = 'SELECT * FROM users WHERE name LIKE ?';
const keyword =
%${req.body.query}%;
db.query(sql, [keyword]); // 正确传参


这样数据库驱动才会帮你安全地转义输入内容,防止注入。

---

**前端要不要做输入验证?**

要,但不是防注入的主要手段。前端可以加一层简单过滤,比如不允许输入中包含
--/* 这类非法字符,但最终防线还是得靠后端参数化查询。

举个前端过滤的例子:

function sanitizeInput(input) {
return input.replace(/[\'";*-
]/g, '');
}


但注意:这只是辅助手段,不是主要防线。

---

**总结:**

1. 后端必须用参数化查询,别自己拼 SQL(代码放这了):
const sql = 'SELECT * FROM users WHERE name LIKE ?';
const keyword = %${req.body.query}%;
db.query(sql, [keyword]); // 正确方式


2. 前端可以简单过滤特殊字符,但不能替代后端防护
3. 搜索体验和安全可以平衡,比如加个提示:“不支持特殊字符,请尝试更通用的关键词”

别再用模板字符串拼 SQL 了,真·翻车现场。
点赞 6
2026-02-04 08:20
技术美荣
后端参数化查询写错了,别在前端加单引号,让后端自己处理。试试这个:

// 前端直接传纯净字符串
fetch('/search', {
method: 'POST',
body: JSON.stringify({ query: userInput }) // 不加单引号
})

// 后端正确写法
const sql = 'SELECT * FROM users WHERE name LIKE ?';
db.query(sql, [%${req.body.query}%]); // 参数拼接交给后端


前端建议只做基本长度限制,别用正则过滤内容,容易误伤。注入防护主要靠后端参数化查询。
点赞 11
2026-01-29 03:06