Node.js выражает правильное использование промежуточного программного обеспечения bodyParser

Я новичок в node.js и экспресс и некоторое время экспериментировал с ними. Теперь меня смущает дизайн экспресс-фреймворка, связанный с разбором тела запроса. Из официального руководства экспресса:

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 только для всех допустимых (определенных) маршрутов и использовать возможность обработки загрузки файлов только на выбранных маршрутах, без большого количества повторений кода?


person leiiv    schedule 14.09.2012    source источник


Ответы (1)


Ваш второй способ хорош. Помните, что вы также можете передавать массивы промежуточных функций app.post, app.get и друзьям. Таким образом, вы можете определить массив с именем uploadMiddleware с вашими вещами, которые обрабатывают тела POST, загрузки и т. д., и использовать его.

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

Примеры предназначены для начинающих. Код для начинающих, который поможет вам заставить чертову штуку работать в первый же день, и рабочий код, эффективный и безопасный, часто очень разные. Вы делаете действительно правильное замечание о том, что не принимаете загрузки по произвольным путям. Что касается синтаксического анализа всех тел запросов, который является «очень неэффективным», это зависит от соотношения недействительных/атакующих запросов POST к законным запросам, отправленным вашему приложению. Среднего уровня радиационного фона запросов зондирования атаки, вероятно, недостаточно, чтобы о нем беспокоиться, пока ваш сайт не станет популярным.

Также здесь есть сообщение в блоге с более подробной информацией о соображениях безопасности bodyParser.

person Peter Lyons    schedule 14.09.2012
comment
Вау, проголосуйте за пересмотр вашего ответа годичной давности, чтобы включить последние события в отношении: bodyParser - person Julian H. Lam; 09.09.2013
comment
Код для начинающих, который поможет вам заставить чертову штуку работать в первый же день, и рабочий код, эффективный и безопасный, часто очень разные. Аминь. - person Patrick Fisher; 21.02.2014