【发布时间】:2020-05-01 11:21:29
【问题描述】:
我知道参数化查询用于防止 SQL 注入,但这如何防止 SQL 注入?有人不能将他们的 id 设置为等于; DROP TABLE * -- 并将其插入到参数化查询中吗?
let updateQueryData = `UPDATE table SET lookups = $1 WHERE id = $2`;
let updateQueryValues = [numLookups, data.rows[0].id];
pool.query(updateQueryData, updateQueryValues, err => {
【问题讨论】:
-
WHERE id = DROP TABLE *会因语法错误而失败。尝试在查询中运行它。 -
当您使用参数化查询时,查询引擎不仅会解析您的参数并将它们放入查询字符串中。它被直接注入查询引擎。因此,它对输入进行了验证,以防止查询注入。
-
它们的关键区别在于参数指示数据库查询引擎这些是 值 并且应该被这样对待,而直接字符串连接不会将此类信息传递给查询引擎并且它只是执行你给它的任何 code。在前者中,占位符和值是分开的,直到它们到达数据库并允许数据库正确处理它们,它知道该怎么做。用户当然可以提供看起来像代码的值,但它只是一个字符串值,仅此而已。
标签: javascript sql