W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
1.10.1 【必須】校驗(yàn)參數(shù)值類型
// bad:執(zhí)行NOSQL操作前,未作任何判斷
app.post("/", (req, res) => {
db.users.find({ username: req.body.username, password: req.body.password }, (err, users) => {
// **TODO:** handle the rest
});
});
// good:在進(jìn)入nosql前先判斷`__USER_INPUT__`是否為字符串。
app.post("/", (req, res) => {
if (req.body.username && typeof req.body.username !== "string") {
return new Error("username must be a string");
}
if (req.body.password && typeof req.body.password !== "string") {
return new Error("password must be a string");
}
db.users.find({ username: req.body.username, password: req.body.password }, (err, users) => {
// **TODO:** handle the rest
});
});
為什么要這么做?
JavaScript中,從http或socket接收的數(shù)據(jù)可能不是單純的字符串,而是被黑客精心構(gòu)造的對(duì)象(Object)。在本例中:
- 期望接收的POST數(shù)據(jù):username=foo&password=bar
- 期望的等價(jià)條件查詢sql語(yǔ)句:select * from users where username = 'foo' and password = 'bar'
- 黑客的精心構(gòu)造的攻擊POST數(shù)據(jù):username[$ne]=null&password[$ne]=null
或JSON格式:{"username": {"$ne": null},"password": {"$ne": null}}
- 黑客篡改后的等價(jià)條件查詢sql語(yǔ)句:select * from users where username != null & password != null
- 黑客攻擊結(jié)果:繞過(guò)正常邏輯,在不知道他人的username/password的情況登錄他人賬號(hào)。
1.10.2 【必須】NoSQL操作前,應(yīng)校驗(yàn)權(quán)限/角色
// 使用express、mongodb(mongoose)實(shí)現(xiàn)的刪除文章demo
// bad:在刪除文章前未做權(quán)限校驗(yàn)
app.post("/deleteArticle", (req, res) => {
db.articles.deleteOne({ article_id: req.body.article_id }, (err, users) => {
// TODO: handle the rest
});
});
// good:進(jìn)入nosql語(yǔ)句前先進(jìn)行權(quán)限校驗(yàn)
app.post("/deleteArticle", (req, res) => {
checkPriviledge(ctx.uin, req.body.article_id);
db.articles.deleteOne({ article_id: req.body.article_id }, (err, users) => {
// TODO: handle the rest
});
});
關(guān)聯(lián)漏洞:高風(fēng)險(xiǎn) - 越權(quán)操作,高風(fēng)險(xiǎn) - NoSQL注入
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: