6

ノードでのファイルのアップロードに関する多くの記事、チュートリアル、および質問がありますが、それらのほとんどは初心者向けであり、本番用のファイル アップロードを保護する方法を完全に説明しているものはありません。私はそれを行う方法について完全な答えを見つけるために非常に努力しましたが、成功しませんでした.

以下は私の調査結果の説明です。

  1. アップロード時のファイル サイズを制限する:

    app.use(express.limit('4mb'));
    
  2. ファイルのアップロードを特定のルートのみに制限します。これを実際に機能させることはできませんが、私が試したのは次のとおりです。

    交換:

    app.use(express.bodyParser());
    

    app.use(express.json());
    app.use(express.urlencoded());
    

    マルチパート ミドルウェアをすべてのアップロード ルートに追加します。

    app.post('/upload', express.multipart(), uploadController.uploadPhoto);
    

    この部分は機能しませんが、そのままにしておくとアップロードは正常に機能しexpress.bodyParser()ます。それで、私は何を間違っていますか?

  3. アップロードをディスクに保存する前に、アップロードされたファイルの種類を確認しています:

    私はこの部分を理解できませんでしたが、ファイルのアップロードを解析するために手ごわいを使用するカスタムミドルウェアを作成し、画像マジックのようなライブラリを使用して、保存する前にファイルのサイズを変更しようとすることを提案しました (画像であると仮定します)。これにより、イメージが安全になり、実際にイメージであることが保証されるという提案がありました (イメージでないとプロセスが失敗するため)。

    ただし、これは画像でのみ機能するため、完全なソリューションではありません。

    どうすればこれを実装できますか? サンプルコードはありますか?

アップロードを安全にするために欠けているものは他にありますか?

4

2 に答える 2

2

アプローチ2は実際に機能します。私が抱えていた問題は、

app.use(passport.session());

動作を停止していました。したがって、passport.js認証に使用している場合、これが問題になる可能性があります。このアプローチを使用する場合は、実際のルートにセキュリティを追加してください。


私はこのプラグインを使用することになった

https://github.com/tih-ra/alleup

これは、画像のアップロードでうまく機能し、ファイルを複数のバージョンに自動的にサイズ変更して、Amazon s3 にアップロードします。このプラグインを使用することは、アプローチ 3 を使用することと一致しますが、ファイルはtmp最初にフォルダーにアップロードされてから削除されます。

于 2013-01-23T12:12:24.517 に答える
1

ファイルのアップロード (およびストリーミング) にマルチパーティを使用しています。

var form = new multiparty.Form();

1に:

form.on('progress', function (bytesReceived) {
  if (262144000 < bytesReceived) {
   abortConnection('filesizeexeeded');
  }
});

独自の中止接続関数を実装します。例えば:

function abortConnection(reason) {
  res.writeHead(413, { 'Connection': 'close' });
  return res.end(reason);
}

警告: ブラウザはおそらくアップロードを再試行します (最大 4 回)。クライアント側でアップロードをキャンセルするために WebSocket 接続を使用しています。

2: (マルチパーティを使用)

To 3: mmmagicを使ってオンザフライで MIME タイプをチェックする方法を示すGistを作成しました。

マルチパーティと組み合わせてパスポートを使用している場合、これが役立つ場合があります。

https://github.com/jaredhanson/passport/pull/106#issuecomment-14188999

于 2014-01-20T14:35:42.383 に答える