这个参数化查询是否开放SQL注入?

Is this parameterized query open to SQL injection?

有人查看我的代码说下面的 SQL 查询 (SELECT * FROM...) 显然容易受到攻击。我对此进行了研究,似乎我通过使用参数化查询正确地做到了这一点,但显然我遗漏了一些东西。

app.get("/api/v1/:userId", async (req, res) => {
    try {
        const teammate = await db.query("SELECT * FROM teammates WHERE uid = ", [
            req.params.userId,
        ]);

此查询未对 SQL 注入开放,因为它使用参数化查询。数据不会替代参数 (),而是在“绑定”消息中单独发送,因此无论数据包含什么,都不会被解释为 SQL 语句的一部分。

而且,看起来参数是一个整数,SQL注入只能发生在字符串参数上。

该公司的某些人可能认为 </code> 将用于字符串插值,而不是 SQL 查询参数。</p> <p>他们可能不知道 PostgreSQL 使用美元符号作为查询参数占位符。 MySQL 等其他数据库使用 <code>? 作为占位符,而 Oracle 在命名参数前使用 : 印记。

您正确地编写了代码。请在此处查看 node.js 和 PostgreSQL 的类似示例:https://node-postgres.com/features/queries “参数化查询”部分特别说明了这种代码风格作为对 SQL 注入的防御。

回想起来,你最好不要得到那份工作。