2011-09-23 7 views
8

オクラシ私はAJAX経由でnodejsバックエンドにPOSTされているJSオブジェクトを持っています。オブジェクトのキーがすでにdbスキーマと完全に一致しているので、このjsオブジェクトを自分のmongoose dbに直接挿入したいと思います。マングース:JSオブジェクトを直接dbに挿入

私は現在、この(ダイナミックかつ過度に複雑ではない)があります。

app.post('/items/submit/new-item', function(req, res){ 
    var formContents = req.body.formContents, 
     itemModel = db.model('item'), 
     newitem = new itemModel(); 

    newitem.item_ID   = ""; 
    newitem.item_title  = formContents.item_title; 
    newitem.item_abv  = formContents.item_abv; 
    newitem.item_desc  = formContents.item_desc; 
    newitem.item_est  = formContents.item_est; 
    newitem.item_origin  = formContents.item_origin; 
    newitem.item_rating  = formContents.item_rating; 
    newitem.item_dateAdded = Date.now(); 

    newitem.save(function(err){ 
     if(err){ throw err; } 
     console.log('saved'); 
    }) 

    res.send('item saved'); 
}); 

をしかし、(セクシーと動的)このような何かにそれをトリミングする:

app.post('/items/submit/new-item', function(req, res){ 
    var formContents = req.body.formContents, 

    formContents.save(function(err){ 
     if(err){ throw err; } 
     console.log('saved'); 
    }) 

    res.send('item saved'); 
}); 
+2

* "OK私はnodejsバックエンドにAJAX経由でPOSTされているJSオブジェクトを持っている。私は、これはオブジェクトキーが既にDBスキーマと完全に一致して、私のマングースのDBにオブジェクトを直接JS挿入したいです"* [SQLインジェクション](http://en.wikipedia.org/wiki/SQL_injection)に似たインジェクション攻撃のための**優れた**ベクタのようなものです。送信する前に、サーバー上のデータを処理して検証することを常にお勧めします。クライアントは信頼できません。 –

+2

はいわかっています。これはテストケースです。それは私の質問ではありませんでした。 – wilsonpage

+0

これは悪いテストケースです。常にデータを検証する必要があります。私は現在、同様のコンテキストで作業しています。データを検証するためにvalidate.jsを正常にテストしました。 –

答えて

9

mongoose(http://tomblobaum.tumblr.com/post/10551728245/filter-strict-schema-plugin-for-mongoose-js)でこのようなプラグインを使用する場合は、newitem[item_title]newitem[item_abv] - またはのように配列に配列をまとめることができますとitem[abv]

要素が一致する場合は、req.body全体を渡すこともできます。そのMongooseStrictプラグインは、あなたのスキーマに明示的に設定されていない値をすべて除外しますが、チェックタイプと検証はまだマングースに任せています。スキーマに適切な検証方法が設定されていると、任意の注入攻撃から安全に保護されます。

EDIT:プラグインを実装したと仮定すると、このコードを使用できるはずです。

app.post('/items/submit/new-item', function(req, res){ 
    new itemModel(req.body.formContents).save(function (e) { 
    res.send('item saved'); 
    }); 
}); 
+0

プラグインを必要とせずに説明したメソッドに感謝します。私は確かにセキュリティを確保するためにそれをさらに日付に実装する必要があります。このようにオーバーライドできるスキーマのポイントは何ですか?他にどのような入力検証方法を提案しますか? – wilsonpage

+0

スキンはmongooseで多くのことを行いますが、最も重要なことに、タイプをmongodbに適切に保存しますが、検証、デフォルト、およびその他のODMの設定もできます。現時点では、mongoose文書のトップレベルは基本的に "Mixed"のように扱われます(何かを受け入れ、更新されたプロパティーがスキーマのプロパティーと一致したときにのみ機能します)。プラグインはモンゴーズをプロパティのみを受け入れるよう強制しますスキーマ内 –

+0

mySQLの背景から来て、私は完全にマングースを理解するのに苦労しています。ドキュメントは私には分かりません。いくつかのリソースや例をお勧めしますか?私は何か高度なことをするつもりはない。 – wilsonpage

関連する問題