2013-06-22 44 views
1

甲貓鼬模型,東西,有兩個字段,其(安全的)只有一個的應通過mass assignment是可設置的:如何保護蒙古語中的字段不受大規模分配?

var db = require('mongoose'); 

var schema = new db.Schema({ 
    safe: { type: String }, // settable through mass assignment 
    unsafe: { type: String } // not settable through mass assignment 
}); 

db.model('Thing', schema); 

控制器通過使參數設置件事:

exports.create = function(req, res) { 
    var thing = new Thing(req.body); 

    // more... 
}; 

攻擊者可以嘗試通過設置不安全的JSON POST請求來設置thing.unsafe。這應該被阻止。

如果像Mongoose的Rails attr_accessible功能一樣可用,那將會很棒。我確實找到了mongoose-mass-assign,但這不像我想要的。首先,貓鼬大規模分配顯然需要使用新的API(兩個質量分配函數)。我想要傳遞params散列的任何本地Mongoose模型函數的質量保護,例如Thing構造函數和Thing.create函數。

如何獲得Mongoose模型的質量分配保護?如果不可用,Mongoose用戶目前如何防範此漏洞?

回答

1

捂臉:

var thing = new Thing(req.body); 

稍有理智的:

var okFields = {}; 
okFields.safe = req.body.safe 
var thing = new Thing(okFields); 
//Also helpful for longer whitelists from underscore: _.pick(req.body, "safe"); 
//Also feel free to add some, y'know, data validation either here or in mongoose 

只是不這樣做。 Rails教會了你一個可怕的反模式。但是要回答你的問題,AFAIK mongoose和mongodb沒有任何機制來執行任何類似於rails的attr_accessible或任何受污染變量的概念。

+0

爲什麼'反模式'和'Facepalm'?由於不支持像attr_accessible這樣的白名單機制,因此是有道理的。這聽起來像是你說沒有白名單,所以不要做羣發任務,這似乎很明顯,也是問題的關鍵。 FWIW,驗證被忽略,以保持示例側重於質量分配問題。 –

+1

只需從不受信任的客戶端獲取原始數據塊並將其插入到數據庫中的想法簡直就是錯誤。你不能在任何現實的應用程序中做到這一點。您有數據驗證運行和授權檢查。安全生產代碼從來不是這樣的。在100行代碼中運行演示博客應用程序是一件很愚蠢的事情。而已。 –

+0

感謝您的觀點。我已經使用了你所描述的方法,它工作正常。 –

相關問題