web-dev-qa-db-ja.com

Node.jsはbodyParserミドルウェアの正しい使用法を表現しています

私はnode.jsとexpressに不慣れで、しばらくの間それらを実験してきました。今、私はリクエスト本文の解析に関連するエクスプレスフレームワークの設計と混同しています。エクスプレスの公式ガイドから:

app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(logErrors);
app.use(clientErrorHandler);
app.use(errorHandler);

すべてのミドルウェアを設定した後、処理するルートを追加します。

app.post('/test', function(req, res){ 
  //do something with req.body      
});

このアプローチの問題は、ルートの有効性がチェックされる前に、すべてのリクエスト本文が最初に解析されることです。無効なリクエストの本文を解析するのは非常に非効率的なようです。さらに、アップロード処理を有効にすると、次のようになります。

app.use(express.bodyParser({uploadDir: '/temp_dir'}));

すべてのクライアントは、ファイルをアップロードすることで(任意のルート/パスにリクエストを送信することで!!)サーバーを攻撃できます。これらのファイルはすべて処理され、「/ temp_dir」に保持されます。このデフォルトの方法が広く宣伝されているなんて信じられません!

もちろん、ルートを定義するときにbodyParser関数を使用できます。

app.post('/test1', bodyParser, routeHandler1);
app.post('/test2', bodyParser, routeHandler2);

または、ルートを処理する各関数の本体を解析することもできます。ただし、これを行うのは面倒です。

すべての有効な(定義された)ルートに対してのみexpress.bodyParserを使用し、コードを何度も繰り返すことなく、選択したルートに対してのみファイルアップロード処理機能を使用するためのより良い方法はありますか?

27
leiiv

2番目の方法で問題ありません。ミドルウェア関数の配列をapp.postapp.getなどに渡すこともできることを忘れないでください。したがって、POST本文、アップロードなどを処理するものでuploadMiddlewareという配列を定義し、それを使用できます。

app.post('/test1', uploadMiddleware, routeHandler1);

例は初心者向けです。初日に気の毒なことを機能させるのに役立つ初心者コードと、効率的で安全な本番コードは、多くの場合非常に異なります。あなたは、任意のパスへのアップロードを受け入れないことについて確かに有効なポイントを作ります。 「非常に非効率的」であるすべてのリクエストボディの解析に関しては、無効/攻撃の比率に依存しますPOSTアプリケーションに送信される正当なリクエストに対するリクエスト。攻撃プローブリクエストの平均バックグラウンド放射線あなたのサイトが人気を博し始めるまで、おそらく心配するのに十分ではありません。

bodyParserのセキュリティに関する考慮事項の詳細が記載されたブログ投稿もあります。

31
Peter Lyons