[英]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.