web-dev-qa-db-ja.com

Node.js:HTTPリクエストサイズとアップロードファイルサイズを制限する方法

Node.jsを使用して表現しています。

HTTPリクエストのサイズを制限したい。たとえば、誰かが2 MBを超えるHTTPリクエストを送信した場合、そのリクエストをすぐに停止します。コードを見て、コアを変更すればできると思います。しかし、max_request_sizeまたはそのようなものを設定する方法はありますか?

それは私の2番目の質問に関連しています。 Expressを使用してreq.filesからアップロードされたファイルを取得しています。ファイルサイズが特定のファイルサイズを超えるとすぐに、/tmpフォルダへのファイルの書き込みを停止する方法(デフォルトのアップロード動作)はありますか?

19
murvinlai

コメントを追加できないため、更新(07-2014)のみ:

上記のとおり、新しいExpressバージョンではlimitミドルウェアの使用が非推奨になり、組み込みオプションBodyParserミドルウェアの場合:

   var express    = require('express')
   var bodyParser = require('body-parser')

   var app = express()
   app.use(bodyParser.json({ limit: '5mb' }))
17
Gaston

Expressは 使用可能な制限ミドルウェア のあるConnectを使用します。これをExpressアプリで使用するには、次のようにします。

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

たとえば、すべてのHTTPリクエストが2 MBに制限されます。アップロードされたファイルはHTTPリクエストの一部であるため、2 MBを超えるファイルのアップロードも中止されます。


注:このミドルウェアは非推奨であり、間もなく削除されます。これが当てはまる理由についての議論は、次の場所で利用できます https://github.com/senchalabs/connect/pull/925#issuecomment-26990726

10
Rohan Singh

ノードgithubのソースコード:

/* Maximium header size allowed. If the macro is not defined
 * before including this header then the default is used. To
 * change the maximum header size, define the macro in the build
 * environment (e.g. -DHTTP_MAX_HEADER_SIZE=<value>). To remove
 * the effective limit on the size of the header, define the macro
 * to a very large number (e.g. -DHTTP_MAX_HEADER_SIZE=0x7fffffff)
 */
#ifndef HTTP_MAX_HEADER_SIZE
# define HTTP_MAX_HEADER_SIZE (80*1024)
#endif 

したがって、80 * 1024の制限を超えるには、ソースからノードを再構築する必要があります

これをExpress 4で使用して、リクエストの本文サイズ/アップロードファイルのサイズを制限することができます。代わりに、express.json()およびexpress.urlencoded()を使用してください。body-parserモジュールが必要で、そのjson()およびurlencoded()メソッドを使用する必要があります。 、拡張オプションがbodyParser.urlencoded()に対して明示的に定義されていない場合、警告がスローされます(body-parserは非推奨の未定義の拡張を提供:拡張オプションを提供)。

var bodyParser = require('body-parser');
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));
8
AJS
var methodOverride = require('method-override');
app.use(bodyParser.urlencoded({
        extended: true, limit: '50mb'
    }));
app.use(bodyParser.json({limit: '50mb'}));
app.use(methodOverride());
0
kk4You

raw-body を使用します。ほとんどのミドルウェア(制限など)はExpressにバンドルされなくなったため、個別にインストールする必要があります。ここに例があります。

var getRawBody = require('raw-body')
app.use(function (req, res, next) {
      getRawBody(
        stream = req,
        options = {
          length: req.headers['content-length'],
          limit: '100mb',
        },
        callback = function (err, reslt) {
          if (err) {
            return next(err)
          }
          next();
          console.log(req)
        })
    })
  • app.useの後にルーターを忘れずに追加してください

Expressでは、以下に示すように、従来のバンドル済みミドルウェアを使用して制限を明示的に設定できなくなりました。

app.use(express.limit('4M'));
0
Wakahiu Njenga

質問1の回答

HTTPリクエストのサイズとアップロードファイルのサイズを制限するには、body-parser制限。

app.use(bodyParser.urlencoded({limit: '50mb',extended: true}));
app.use(bodyParser.json({limit: '50mb'}));

bodyParser.urlencoded

フロントエンドからのファイルは、urlencodedボディとして提供されます。

URLエンコードされた本体のみを解析するミドルウェアを返します。このパーサーは本文のUTF-8エンコーディングのみを受け入れ、gzipおよびdeflateエンコーディングの自動インフレーションをサポートします。

解析されたデータを含む新しいbodyオブジェクトが、ミドルウェア(つまり、req.body)の後の要求オブジェクトに入力されます。このオブジェクトにはキーと値のペアが含まれ、値は文字列または配列(extendedがfalseの場合)、または任意のタイプ(extendedがtrueの場合)になります。

bodyParser.json

Jsonのみを解析するミドルウェアを返します。このパーサーは本文のUnicodeエンコーディングを受け入れ、gzipおよびdeflateエンコーディングの自動インフレーションをサポートします。

解析されたデータを含む新しいbodyオブジェクトが、ミドルウェア(つまり、req.body)の後の要求オブジェクトに入力されます。

:デフォルトでは、ボディパーサーの入力制限は100kb

質問2の回答

デフォルトのアップロードディレクトリを変更するには、以下を使用できます。

app.set('uploadDir', './files');  // Sets the upload Directory to files folder in your project.

その他の実装

アプリにbodyParserを含めながら、アップロードディレクトリについても触れます。

app.use(express.bodyParser({uploadDir:'./files', keepExtensions: true}));

参照

問題https://github.com/expressjs/express/issues/1684

お役に立てれば!

0
SUNDARRAJAN K

廃止されていない更新されたソリューションの場合は、app.jsファイルにそのように制限を追加できます。

app.use(express.json({limit: '2mb'}));
app.use(express.urlencoded({limit: '2mb', extended: false}));

次のようにすることもできます:

app.use(express.json({limit: 2000000}));
app.use(express.urlencoded({limit: 2000000, extended: false}));
0
elarcoiris