Knex.js 和 NodeJS - 用于选择、插入、删除、更新的动态端点

Knex.js and NodeJS - Dynamic Endpoints for Select, Insert, Delete, Update

提问人:Vacation 提问时间:12/14/2022 更新时间:12/15/2022 访问量:206

问:

目前正在将 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');
}
});

我的理解是,拥有它可能是一种威胁,因为这意味着人们可以删除他们想要的任何内容以及多少行等。

有没有办法让它更安全(我们有很多查询在运行),或者将所有内容移动到硬编码的单个端点基础上是否更明智?

谢谢

javascript mysql node.js sql 注入 knex.js

评论


答:

0赞 Bill Karwin 12/14/2022 #1

是的,这是 SQL 注入的设计。看起来它接受任何任意的 WHERE 子句,所以只要返回 true,他们就可以删除他们想要的任何内容。checkTableWhitelist()

通常,不建议接受请求输入,然后将其逐字用作代码。这适用于 SQL 和在运行时分析的任何其他代码。例如,您不应该接受任意 Javascript 代码作为输入,而只是将其传递给执行它。eval()

我会编写一些条件来解释输入,确保它是一组规定的删除类型之一,然后有条件地形成查询。不要在查询中使用输入的文本,而只使用输入来选择要运行的 DELETE 语句。这使您可以控制。

0赞 purplenet 12/15/2022 #2

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()