在前端用模板字符串拼接SQL时,怎么防OWASP Top 10的注入漏洞?
我在做用户搜索功能时,后端让前端传原始搜索词,用模板字符串拼接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}%`]); // 参数未正确隔离
这种情况下应该如何正确实现参数化查询?前端需要做哪些输入验证?是否需要在前后端同时处理才能完全防范注入攻击?
**后端参数化查询写错了!**
你这段代码:
这根本不是参数化查询的写法。参数化是把变量传进去让数据库驱动处理,不是你自己拼字符串再塞进去。应该是这样:
这样数据库驱动才会帮你安全地转义输入内容,防止注入。
---
**前端要不要做输入验证?**
要,但不是防注入的主要手段。前端可以加一层简单过滤,比如不允许输入中包含