19

私は、およびで遊んでいます。

何かをすぐに実行できるようにするために、Express クエリ文字列オブジェクトをマングースの検索関数に直接渡しています。私が興味を持っているのは、この慣習が実際のアプリでどれほど危険かということです。RDBMS が SQL インジェクションに対して非常に脆弱であることはわかっています。「入力をサニタイズする」という良いアドバイスは別として、このコードがいかに悪いか:

app.get('/query', function (req, res) {
    models.findDocs(req.query, function (err, docs) {
            res.send(docs);
        });
});

つまり、 get リクエストhttp://localhost:8080/query?name=ahsteele&status=aは、次のものを findDocs 関数に押し込むだけです:

{
  name: 'ahsteele',
  status: 'a'
}

これは多くの理由で不快に感じますが、どれほど安全ではないのでしょうか? クエリ パラメータを mongodb に渡すためのベスト プラクティスは何ですか? Express はすぐに使えるサニタイズを提供しますか?

4

3 に答える 3

21

インジェクションが問題である限り、SQL のように、リスクは大幅に低くなります...理論的には未知の攻撃ベクトルを介して可能ですが.

データ構造とプロトコルは、ドメイン固有の言語内でエスケープされた値を利用するのではなく、バイナリと API によって駆動されます。基本的に、パーサーをだまして「;db.dropCollection()」を最後に追加させることはできません。

クエリにのみ使用する場合は、おそらく問題ありません...ただし、少しの検証を使用するように注意してください。

  • 英数字のみを使用するようにします (null など、通常は受け入れないものをフィルター処理または無効化します)。
  • 用語ごとに最大長 (255 文字など) を適用する
  • クエリ全体の最大長を強制する
  • 「$ where 」などの「$」で始まる特別なパラメータ名を削除します
  • ネストされた配列/ドキュメント/ハッシュを許可しないでください...文字列と整数のみ

また、空のクエリはすべてを返すことに注意してください。その戻り値に制限が必要な場合があります。:)

于 2013-04-10T06:50:23.347 に答える
3

私の知る限り、Express はサニタイズのためのすぐに使えるコントロールを提供していません。独自のミドルウェアを作成して、独自のロジックでいくつかの基本的なチェックを行うことができます。また、あなたが言及したケースは少し危険です。

しかし、使いやすさのために、Mongoose モデルに組み込まれている必要な型は、少なくともデフォルトのサニタイズと、何が入るかどうかをある程度制御できるようにします。

たとえば、このようなもの

var Person = new Schema({
  title   : { type: String, required: true }
, age     : { type: Number, min: 5, max: 20 }
, meta    : {
      likes : [String]
    , birth : { type: Date, default: Date.now }
  }

});

詳細については、これも確認してください。

http://mongoosejs.com/docs/2.7.x/docs/model-definition.html

于 2013-04-10T06:34:47.223 に答える