Вопрос по node.js, express, connect – Node.js выражают правильное использование промежуточного программного обеспечения bodyParser

27

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

Ваш Ответ

1   ответ
31

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

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

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

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

Код для начинающих, который поможет вам работать в первый день, а производственный код, который эффективен и безопасен, часто сильно отличается ». Аминь. Patrick Fisher
Ничего себе, припомни за повторный ответ на твой год назад, чтобы включить последние события:bodyParser Julian H. Lam

Похожие вопросы