Node.js: как ограничить размер HTTP-запроса и размер загружаемого файла? - PullRequest
17 голосов
/ 29 января 2012

Я использую Node.js и экспресс.

Я бы хотел ограничить размер HTTP-запроса. Допустим, если кто-то отправит мне HTTP-запрос размером более 2 МБ, я немедленно остановлю его. Я посмотрел на код и думаю, что если я изменю ядро, я смогу это сделать. Тем не менее, есть ли способ установить max_request_size или что-то подобное?

Это как-то связано с моим вторым вопросом. Я использую экспресс, чтобы получить загруженный файл из req.files. Есть ли способ прекратить запись файла в папку /tmp (что является режимом загрузки по умолчанию), как только размер файла превышает определенный размер файла?

Ответы [ 6 ]

17 голосов
/ 22 июля 2014

Просто обновление (07-2014), так как я не могу добавлять комментарии:

Как правильно отмечено выше, более новые версии Express устарели использовать промежуточное ПО limit и теперь предоставляют егокак встроенная опция для промежуточного программного обеспечения BodyParser:

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

   var app = express()
   app.use(bodyParser.json({ limit: '5mb' }))
10 голосов
/ 29 января 2012

Express использует Connect, для которого доступно промежуточное программное обеспечение ограничения .Вы можете использовать это в своем приложении Express, выполнив что-то вроде этого:

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

Это, например, ограничит все HTTP-запросы 2 МБ.Поскольку загруженные файлы являются частью HTTP-запроса, любая загрузка файлов, размер которой превышает 2 МБ, также будет прервана.


ПРИМЕЧАНИЕ: Это промежуточное ПО устарело и будет вскоре удалено.Обсуждение того, почему это так, доступно по адресу: https://github.com/senchalabs/connect/pull/925#issuecomment-26990726

8 голосов
/ 29 марта 2017

Исходный код узла 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* 1004 *

Вы можете использовать это с Express 4 для ограничениязапрашивать размер тела / размер загружаемого файла, вместо express.json () и express.urlencoded (), вам потребуется модуль body-parser и использовать его методы json () и urlencoded (), если расширенный параметр явно не определендля bodyParser.urlencoded () будет выдано предупреждение (анализатор тела не рекомендуется undefined extended: предоставить расширенную опцию).

var bodyParser = require('body-parser');
app.use(bodyParser.json({limit: '50mb'}));
app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));
0 голосов
/ 22 апреля 2019

Для обновленного решения, которое не является устаревшим, вы можете добавить ограничение следующим образом: в файле 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 голосов
/ 29 марта 2017

Ответ на вопрос 1 :

Чтобы ограничить размер HTTP-запроса и размер загружаемого файла, нам нужно установить ограничение body-parser.

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

bodyParser.urlencoded

Файлы с внешнего интерфейса представлены в виде тел с урлен-кодированием.

Возвращает промежуточное программное обеспечение, которое анализирует только тел с урлен-кодированием.Этот синтаксический анализатор принимает только кодировку тела в кодировке UTF-8 и поддерживает автоматическое наложение кодировок gzip и deflate.

Новый объект тела, содержащий проанализированные данные, заполняется в объекте запроса после промежуточного программного обеспечения (то есть req.body),Этот объект будет содержать пары ключ-значение, где значением может быть строка или массив (если для параметра extended установлено значение false), или любой тип (если для параметра extended установлено значение true).

bodyParser.json

Возвращает промежуточное ПО, которое анализирует только json.Этот синтаксический анализатор принимает любую кодировку Unicode тела и поддерживает автоматическое наложение кодировок gzip и deflate.

Новый объект тела, содержащий проанализированные данные, заполняется в объекте запроса после промежуточного программного обеспечения (то есть 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 голосов
/ 20 декабря 2016

Использование 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'));
...