28

私は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 を使用し、選択したルートに対してのみファイル アップロード処理機能を使用し、多くのコードを繰り返さずに使用するより良い方法はありますか?

4

1 に答える 1

32

2番目の方法は問題ありません。app.postapp.getおよび友人にミドルウェア関数の配列を渡すこともできることを覚えておいてください。uploadMiddlewareしたがって、POST ボディ、アップロードなどを処理するもので呼び出される配列を定義し、それを使用できます。

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

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

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

于 2012-09-14T05:48:29.593 に答える