提问人:Vacation 提问时间:12/14/2022 更新时间:12/15/2022 访问量:206
Knex.js 和 NodeJS - 用于选择、插入、删除、更新的动态端点
Knex.js and NodeJS - Dynamic Endpoints for Select, Insert, Delete, Update
问:
目前正在将 Web 应用程序迁移到使用 Knex 来帮助解决与 SQL 注入有关的问题。
Knex 帮助我们停止了运行不同和新查询的问题,但是我们有一个问题。目前我们有 4 个端点,如下所示:
router.all('/deleteTable', checkAuth, (req, res) => {
if (checkTableWhitelist(req.body.table) === true) {
knexMarsDb(req.body.table)
.where(req.body.where)
.del()
.then((result) => {
console.log(result);
res.json({ success: true, message: 'deleted' });
})
.catch((error) => {
res.json({ success: false, message: 'failure' });
console.log(error);
});
} else {
res.send(401, 'You are not authorised for this request');
console.log('Table not in whitelist');
}
});
我的理解是,拥有它可能是一种威胁,因为这意味着人们可以删除他们想要的任何内容以及多少行等。
有没有办法让它更安全(我们有很多查询在运行),或者将所有内容移动到硬编码的单个端点基础上是否更明智?
谢谢
答:
是的,这是 SQL 注入的设计。看起来它接受任何任意的 WHERE 子句,所以只要返回 true,他们就可以删除他们想要的任何内容。checkTableWhitelist()
通常,不建议接受请求输入,然后将其逐字用作代码。这适用于 SQL 和在运行时分析的任何其他代码。例如,您不应该接受任意 Javascript 代码作为输入,而只是将其传递给执行它。eval()
我会编写一些条件来解释输入,确保它是一组规定的删除类型之一,然后有条件地形成查询。不要在查询中使用输入的文本,而只使用输入来选择要运行的 DELETE 语句。这使您可以控制。
Knex 是一个查询构建器(通常被其他高级库(如 ORM)用作构建块) 它阻止了 SQL 注入,因为在后台实现了占位符。
因此,假设函数“checkTableWhitelist”按预期工作(不易受攻击),您只是让最终用户完全控制这些表。
假设这是您想要实现的行为,则始终不建议直接在外部公开数据库。
如果安全性是您的问题,您应该以更严格的方式实现您的 API。
前任。 为要授予的每个操作公开一个终结点,
API/TABLE/FIELD/:ID/删除
api/users/1/delete
api/group/1/delete
...
因此,控制器逻辑将是:
knexMarsDb('users')
.where('id', req.params.id)
.del()
评论