簡體   English   中英

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 子句,所以只要checkTableWhitelist()返回 true,他們就可以刪除他們想要的任何內容。

一般來說,接受請求輸入然后將其作為代碼逐字使用是不可取的。 這適用於 SQL 和在運行時解析的任何其他代碼。 例如,您也不應該接受任意 Javascript 代碼作為輸入,而只是將其傳遞給eval()來執行它。

我會編寫一些條件來解釋輸入,確保它是一組規定的刪除類型之一,然后有條件地形成查詢。 不要在查詢中使用輸入的文本,而只能使用輸入來選擇要運行的 DELETE 語句。 這使您可以控制。

Knex 是一個查詢生成器(通常用作其他高級庫(如 ORM)的構建塊)它可以防止 SQL 注入,因為它在底層實現了占位符。

因此,假設函數“checkTableWhitelist”按預期工作(不易受攻擊),您只是讓最終用戶完全控制這些表。

假設這是你想要實現的行為,那么直接對外暴露數據庫總是不可取的。

如果您擔心安全問題,您應該以更嚴格的方式實施您的 API。

前任。 為您要授予的每個操作公開一個端點,

API/表/字段/:ID/刪除

api/users/1/delete

api/group/1/delete

...

所以控制器邏輯將是:

knexMarsDb('users')
.where('id', req.params.id)
.del()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM