2012-09-14 7 views
26

Jestem nowym użytkownikiem node.js i wyrażam i eksperymentowałem z nimi przez jakiś czas. Teraz jestem mylony z projektem wyraźnej struktury związanej z analizą treści żądania. Od oficjalnego przewodnika Express:Node.js wyraża poprawne użycie oprogramowania pośredniego bodyParser

app.use(express.bodyParser()); 
app.use(express.methodOverride()); 
app.use(app.router); 
app.use(logErrors); 
app.use(clientErrorHandler); 
app.use(errorHandler); 

Po ustawieniu wszystkich middleware, następnie dodajemy trasę które chcemy obsługiwać:

app.post('/test', function(req, res){ 
    //do something with req.body  
}); 

Problem z tego podejścia jest to, że cały korpus żądanie zostanie przeanalizowany najpierw przed sprawdzeniem poprawności trasy. Wydaje się bardzo nieskuteczne analizowanie treści nieprawidłowych żądań. A nawet więcej, jeśli umożliwiają przetwarzanie Dodano:

app.use(express.bodyParser({uploadDir: '/temp_dir'})); 

Każdy klient może bombardować serwera przesyłając dowolne pliki (wysyłając żądanie każdej trasy/ścieżki !!), wszystkie, które będą przetwarzane i przechowywane w "/ temp_dir". Nie mogę uwierzyć, że ta domyślna metoda jest szeroko promowana!

Możemy oczywiście przy określaniu trasy użyć funkcji bodyParser:

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

lub nawet może analizować ciała w każdej funkcji, które obsługiwać trasę. Jest to jednak żmudne.

Czy istnieje lepszy sposób korzystania z express.bodyParser tylko dla wszystkich ważnych (zdefiniowanych) tras i korzystania z możliwości przesyłania plików tylko na wybranych trasach, bez konieczności powtarzania wielu kodów?

Odpowiedz

30

Twoja druga metoda jest w porządku. Pamiętaj, że możesz także przekazywać tablice funkcji oprogramowania pośredniego do app.post, app.get i do znajomych. Możesz więc zdefiniować tablicę o nazwie uploadMiddleware ze swoimi rzeczami, które obsługują ciała POST, przesyłane pliki itp. I używają tego.

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

Przykłady dotyczą początkujących. Kod dla początkujących, który pomoże Ci uzyskać to cholerstwo w dniu 1, a kod produkcyjny, który jest wydajny i bezpieczny, jest często bardzo odmienny. Z całą pewnością zgadzasz się z tym, że nie akceptujesz przesyłania do dowolnych ścieżek. Jeśli chodzi o przetwarzanie wszystkich ciał żądań, które są "bardzo nieefektywne", zależy to od stosunku wniosków POST o nieprawidłowe/ataki do uzasadnionych żądań przesłanych do aplikacji. Średnie promieniowanie tła sondowania ataków prawdopodobnie nie wystarcza, aby się martwić, dopóki witryna nie stanie się popularna.

Also here's a blog post with further details of the security considerations of bodyParser.

+1

Wow, upvote na ponowne swoją odpowiedź z rok temu to ostatnie wydarzenia re: 'bodyParser' –

+0

„kod Początkujący aby pomóc Ci cholerstwo pracy w dniu 1 i produkcji kodu, który jest skuteczny i bezpieczne są często bardzo różne. " Amen. –