web-dev-qa-db-fra.com

Node.js: comment limiter la taille de la requête HTTP et la taille du fichier de téléchargement?

J'utilise Node.js et express.

Je voudrais limiter la taille de la requête HTTP. Disons que si quelqu'un m'envoie une requête HTTP de plus de 2 Mo, j'arrête immédiatement la requête. J'ai regardé le code et je pense que si je change le noyau, je peux le faire. Cependant, y a-t-il un moyen de définir un max_request_size ou quelque chose comme ça?

C'est un peu lié à ma deuxième question. J'utilise express pour obtenir un fichier téléchargé à partir de req.files. Existe-t-il un moyen d'arrêter d'écrire le fichier dans le dossier /tmp (qui est le comportement de téléchargement par défaut) dès que la taille du fichier dépasse une certaine taille?

17
murvinlai

Juste une mise à jour (07-2014), car je ne peux pas ajouter de commentaires:

Comme indiqué plus haut, les versions Express les plus récentes déconseillent l'utilisation du middleware limit et le fournissent désormais sous la forme d'une option intégréepour le middleware BodyParser:

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

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

Express utilise Connect, qui a un middleware limite disponible . Vous pouvez utiliser cela dans votre application Express en procédant comme suit:

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

Cela limiterait par exemple toutes les requêtes HTTP à 2 Mo. Étant donné que les fichiers téléchargés font partie de la requête HTTP, tout téléchargement de fichier supérieur à 2 Mo serait également abandonné.


NOTE: Ce middleware est obsolète et sera bientôt supprimé. Vous pouvez en discuter à l’adresse suivante: https://github.com/senchalabs/connect/pull/925#issuecomment-26990726

10
Rohan Singh

Code source du noeud 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 

Donc, vous devez reconstruire le noeud à partir de la source pour dépasser la limite de 80 * 1024

Vous pouvez utiliser ceci avec Express 4 pour limiter la taille du corps de la requête/la taille du fichier de téléchargement, au lieu de express.json () et express.urlencoded (), vous devez exiger le module body-parser et utiliser ses méthodes json () et urlencoded (). , si l’option étendue n’est pas explicitement définie pour bodyParser.urlencoded (), un avertissement est émis (analyseur de corps obsolète, modèle indéfini étendu: fourniture étendue). 

var bodyParser = require('body-parser');
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));
7
AJS

Utilisez raw-body . La plupart des middleware (comme limit) ne sont plus fournis avec Express et doivent être installés séparément. Voici un exemple.

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)
        })
    })
  • N'oubliez pas d'ajouter le routeur après le app.use

Express ne vous permet plus de définir explicitement la limite à l'aide du middleware traditionnel fourni, comme indiqué ci-dessous.

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

Réponse pour la question 1 :

Pour limiter la taille de la requête HTTP et la taille du fichier de téléchargement, nous devons définir la limite body-parser.

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

bodyParser.urlencoded

Les fichiers du front-end se présentent sous forme de corps encodés.

Renvoie le middleware qui analyse uniquement les corps codés par URL. Cet analyseur accepte uniquement le codage UTF-8 du corps et prend en charge le gonflage automatique des codages gzip et deflate.

Un nouvel objet body contenant les données analysées est rempli sur l'objet requête après le middleware (c'est-à-dire req.body). Cet objet contiendra des paires clé-valeur, où la valeur peut être une chaîne ou un tableau (lorsque étendu est false) ou tout type (lorsque étendu est vrai).

bodyParser.json

Renvoie le middleware qui analyse uniquement json. Cet analyseur accepte tout codage Unicode du corps et prend en charge le gonflage automatique des codages gzip et deflate.

Un nouvel objet body contenant les données analysées est rempli sur l'objet requête après le middleware (c'est-à-dire req.body).

Remarque : Par défaut, la limite d'entrée pour l'analyseur de corps est 100kb

Réponse à la question 2 :

Pour changer le répertoire de téléchargement par défaut, nous pouvons utiliser ce qui suit.

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

Autre implémentation

Tout en incluant le bodyParser dans l'application, nous pouvons mentionner le répertoire de téléchargement.

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

Référence

Issues : https://github.com/expressjs/express/issues/1684

J'espère que cela t'aides!

0
SUNDARRAJAN K