Вопрос по node.js, connect, express – 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'}));

Любой клиент может засыпать сервер, загрузив любые файлы (отправив запрос на ЛЮБОЙ маршрут / путь !!), и все они будут обработаны и сохранены в «/ apos; / temp_dir». Я не могу поверить, что этот метод по умолчанию широко рекламируется!

Конечно, мы можем использовать функцию bodyParser при определении маршрута:

app.post('/test1', bodyParser, routeHandler1);
app.post('/test2', bodyParser, routeHandler2);

или даже, возможно, анализировать тело в каждой функции, которая обрабатывает маршрут. Однако это утомительно.

Есть ли лучший способ использовать express.bodyParser только для всех допустимых (определенных) маршрутов и использовать возможность обработки загрузки файлов только на выбранных маршрутах без большого количества повторений кода?

Ваш Ответ

1   ответ
31

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

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

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

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

& quot; Код для начинающих, который поможет вам работать в первый день, а производственный код, который эффективен и безопасен, часто сильно отличается. & quot; Аминь.
Ничего себе, припомните за повторный ответ на ваш вопрос год назад, чтобы включить последние события:bodyParser

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