2016-03-04 37 views
4

我是新來Sequelize(使Node.js的ORM),如果下面的代碼是安全的疑惑:Sequelize model.build(req.body)對於注射安全嗎?

var models = require('../models'); 
var router = require('express').Router(); 

router.post('/', function(req, res, next){ 
    models.Account 
    .create(req.body)  // <-- THIS IS WHAT MY QUESTION IS ABOUT, IS THIS SAFE? 
    .then(function(result){ 
     res.status(200) 
     .send(result) 
     .end(); 
    }).catch(next); 
}); 

如果您正在使用這個,難道這是在某種方式不安全? 其他的解決辦法是:

var models = require('../models'); 
var router = require('express').Router(); 

router.post('/', function(req, res, next){ 
    models.Account 
    .create({ 
     username: req.body.username, // <-- THIS IS MORE VERBOSE BUT PROBABLY SAFER? 
     accountname: req.body.accountname, 
     level:  req.body.level 
    }) 
    .then(function(result){ 
     res.status(200) 
     .send(result) 
     .end(); 
    }).catch(next); 
}); 

所以基本上我的問題是:是否可以安全使用完整的請求體作爲輸入model.create()函數(model.set()model.build())?

回答

0

作爲一般規則,在將數據傳遞到任何持久性技術之前,您應該驗證輸入以查看它是否對您的域是安全的。因此,即使這從SQL注入攻擊的角度來看是安全的,我仍然建議在調用models.Account.create之前通過額外的驗證步驟來執行第二種方法,以便將已知值傳遞給ORM,而不是任何進來的HTTP請求的身體(這可能是任何東西,不只是在你的網頁上)

+1

聽起來像一般的有效點(如你所說)。但在這種特殊的ORM情況下,模型的驗證功能已經在ORM中。不應該在ORM中完成所有驗證嗎?保持精簡控制器通常被認爲是很好的做法。 –

+0

如果你想以不同的方式來看待它,你正在處理與外部系統交談的兩個端點(這些都沒有什麼區別)。進出這些端點的數據應該設計用於這些端點(這不一定與您的系統需要的或者其他端點需要的相同)。 –

+0

對不起,這是一個相當抽象的迴應。 –