这个参数化查询是不是对 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 注入开放?的主要内容,如果未能解决你的问题,请参考以下文章

SQL注入与参数化查询

参数化查询为什么能够防止SQL注入 (转)

参数化的 java 持久性查询是不是容易受到 sql 注入的影响?

参数化sql查询语句

使用参数化的 SqlCommand 是不是使我的程序免受 SQL 注入的影响?

(记录)mysql分页查询,参数化过程的坑