这个参数化查询是不是对 SQL 注入开放?
Posted
技术标签:
【中文标题】这个参数化查询是不是对 SQL 注入开放?【英文标题】:Is this parameterized query open to SQL injection?这个参数化查询是否对 SQL 注入开放? 【发布时间】:2021-11-16 10:11:14 【问题描述】:查看我的代码的人说下面的 SQL 查询 (SELECT * FROM...) 显然容易受到攻击。我对此进行了研究,似乎我通过使用参数化查询正确地做到了这一点,但显然我遗漏了一些东西。
app.get("/api/v1/:userId", async (req, res) =>
try
const teammate = await db.query("SELECT * FROM teammates WHERE uid = $1", [
req.params.userId,
]);
【问题讨论】:
我没看到。 这是一个参数化查询,所以它不是 sql 可注入的 他有没有具体说SQL注入?攻击的种类比这还多。例如枚举。 嗨@jjanes -- 是的,他特别引用了上面查询的那一行,并写道它“有一个非常明显的SQL注入漏洞”。不过,我会阅读枚举攻击。谢谢。这样做的背景是,我被一家著名的英国零售商招聘为初级/中级 SWE 职位,但当他们在我的 GitHub 上看到这一点时,我的第一轮面试被取消了。我不知道发表此评论的工程师的水平。 【参考方案1】:此查询不对 SQL 注入开放,因为它使用参数化查询。数据不会替代参数($1
),而是在“绑定”消息中单独发送,因此无论数据包含什么,都不会被解释为 SQL 语句的一部分。
而且,看起来参数是一个整数,SQL注入只能发生在字符串参数上。
【讨论】:
Dankeschön für Ihre Antwort,@Laurenz! Das freut mich sehr【参考方案2】:该公司的某人可能认为$1
将用于字符串插值,而不是 SQL 查询参数。
他们可能不知道 PostgreSQL 使用美元符号符号作为查询参数占位符。 mysql 等其他数据库使用?
作为占位符,Oracle 在命名参数前使用:
sigil。
您正确地编写了代码。在此处查看 node.js 和 PostgreSQL 的类似示例:https://node-postgres.com/features/queries“参数化查询”部分专门展示了这种代码样式作为对 SQL 注入的防御。
回想起来,你最好不要得到那份工作。
【讨论】:
哇,感谢您的评论,@Bill Karwin!我很荣幸。你说得对,看来我躲过了一劫:)以上是关于这个参数化查询是不是对 SQL 注入开放?的主要内容,如果未能解决你的问题,请参考以下文章
参数化的 java 持久性查询是不是容易受到 sql 注入的影响?