这个参数化查询是否开放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 注入的防御。
回想起来,你最好不要得到那份工作。
有人查看我的代码说下面的 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 注入的防御。
回想起来,你最好不要得到那份工作。