5

私はexpress.jsとノードを使用してファイルのアップロードを処理することに取り組んでおり、基本的な機能が機能しています。必要なのは、いくつかのセキュリティ対策を実装することです。つまり、アップロードを特定の形式 (PNG、JPEG) に制限することです。特定のフォーマットのみを許可する簡単な方法はありますか? ボディパーサーに入るでしょうか?

app.use(express.bodyParser({
    uploadDir: __dirname + '/public/uploads',
    keepExtensions: true   }));

app.use(express.limit('4mb'));

他に考慮すべきセキュリティ対策はありますか? 通常、画像から EXIF データを消去することは良い考えですか?

ありがとう、

ベン

4

2 に答える 2

6

connect のドキュメントにbodyParserよると、すべてのオプションは、実際のフォーム解析を行うformidableにも渡されます。

手ごわい docsによると、独自のonPartハンドラーを渡すことができます。

incomingForm.onPart(部分)

マルチパート ストリームに直接アクセスする場合は、このメソッドを上書きできます。これを行うと、他の方法で発生する「フィールド」/「ファイル」イベントの処理が無効になり、処理の処理は完全にユーザーの責任になります。

incomingForm.onPart = function(part) {
  part.addListener('data', function() {
    // ...
  });
}

formidable を使用して特定の部分のみを処理したい場合は、次のようにします。

incomingForm.onPart = function(part) {
  if (!part.filename) {
    // let formidable handle all non-file parts
    incomingForm.handlePart(part);
  }
}

まとめると、次のようなことができるはずです。

function onPart(part) {
    if(!part.filename || part.filename.match(/\.(jpg|jpeg|png)$/i)) {
        this.handlePart(part);
    }
}

app.use(express.bodyParser({onPart: onPart});

警告: 私はこれをテストしていません。

于 2012-07-12T19:26:34.313 に答える
2

私は潜在的な解決策を見つけました:

あなたのミドルウェアでは、

    if (req.files[key].type != 'image/png' && req.files[key].type != 'image/jpeg'){
      res.send(403);
    } else {
      next(); 
    }

更新: ただし、これは実際にはファイルのアップロードを停止しません。

于 2012-07-12T18:18:33.493 に答える