我正在我的DB上测试可能的SQL注入,并且运行一个简单的函数来获得用户不应该得到的结果。返回值基于id是正确的,但是查询的其余部分完全被忽略。
我想从数据表中返回所有数据。
我的语法有什么问题吗?
以下是我的实现:
function test(id) {
db.query("SELECT * FROM users WHERE id = ?", [id], (err, result) => {
console.log(result[0]);
});
}
const id = "122 UNION SELECT * FROM data";
test(id);发布于 2022-01-29 20:13:36
这看起来像带有npm mysql驱动程序包的nodejs。而且,我猜您的id列被定义为INT或BIGINT,而不是某种文本字符串。
使用.query()方法的方式是防止SQL注入的正确方法。它是参数化的。这意味着SQL中的每个参数都由一个?占位符表示。.query()的第二个参数是替换占位符的参数值数组。对于用例,驱动程序生成如下所示的查询。
SELECT * FROM users WHERE id = '122 UNION SELECT * FROM data' 并将其传递给MySQL服务器。然后,服务器获取您传递的字符串,并尝试将其解释为一个数字。由于MySQL中的一个怪癖,它将您的'122 UNION SELECT * FROM data'字符串解释为数字122,因此查找WHERE id = 122。(MySQL通过查找前导数将字符串强制转换为整数。所以123RedLight给出123,Hello给出0。这可能会让人困惑。当给定字符串时,RDBMS的其他生成和模型会抛出错误,而这些字符串都是需要整数的。
它正确地忽略了字符串的其余部分。
如果您想使您的代码易受SQL注入的攻击(您要执行,而不是要这样做!)你会写
function test(id) { /* danger: sql injection in next line */
db.query("SELECT * FROM users WHERE id = " + id, (err, result) => { /* wrong ! */
console.log(result[0]);
});
}这会让
SELECT * FROM users WHERE id = 122 UNION SELECT * FROM data到服务器,让你的数据泄漏。
发布于 2022-01-29 20:05:24
你不能这样做。实际上,不能做到这一点就是参数化查询的整点。它防止攻击者将像122; DROP Table users;这样的字符串作为输入。
https://stackoverflow.com/questions/70909108
复制相似问题