9

MongoDB に書き込む前にすべてのデータをサニタイズする事前ハンドラーを作成しようとしています: http://mongoosejs.com/docs/middleware.html

各プロパティをサニタイズできるようにするために、次のことを試しました。

  blogSchema.pre('save', function (next) {
        var obj = this;
        console.log(obj)//-> https://gist.github.com/daslicht/70e0501acd6c345df8c2

        // I've tried the following to get the single items :
        Object.keys(obj).forEach(function (key) {
            console.log('Keys: ',obj[key]);
        });

        //and:
        for(var key in obj) {
            console.log(obj[key])
        }

        //and:
        _.each( self , function(value, key, list){
            console.log('VALUE:',key);
       })
        next();
    })

上記のアプローチのいずれも、次のような結果になります。

それは次の出力です:

    for(var key in obj) {
       console.log(obj[key])
    }

https://gist.github.com/daslicht/cb855f53d86062570a96

サニタイズできるように、各プロパティを取得する方法を知っている人はいますか?

〜マーク

[編集] 考えられる回避策の 1 つを次に示します。いずれにせよ、これはより DRY になるため、Scheme レベルで直接使用する方がクリーンです。

        var post = {
            createdAt : req.body.date,
            createdBy : req.user.username,
            headline : req.body.headline,
            content : req.body.content
        }

        _.each( post , function(value, key, list){
           post[key] =  sanitize(value).xss(); //its the sanetize function of node validator
        })

        var item = new Blog(post);
4

3 に答える 3

3

Google Caja を使用してサニタイズを実行する mongoose -sanitizerプラグインを使用できます。

于 2016-03-23T11:25:23.657 に答える
0

これを行う簡単な方法を次に示します。これはasync.jsを使用しますが、一般的な JS ループまたはその他の制御フロー ライブラリを使用するようにリファクタリングできます。重要なのは、ドキュメントのフィールドの配列を取得することです。次に、それらを反復処理し、現在のコンテキストを使用して値を取得/設定できますthis. 私の知る限り、これは文字列以外の値を文字列に強制しません。文字列、数値、ブール値、objectIds でテストしたところ、元のデータ型として正常に保存されました。

yourSchema.pre('save', function (next) {
  var self = this;

  // Get the document's fields
  var fields = Object.keys(this._doc);

  // Iteratively sanitize each field
  async.each(fields, function(field, cb) {
    self[field] = validator.escape(self[field]);
    cb();
  }, function(err){
    next();
  });
});
于 2014-06-30T16:32:13.733 に答える