node.js bezbednost

Unapredite Node.js bezbednost

15 јуна, 2022

Node.js postaje sve zreliji, bez sumnje – uprkos tome, nema mnogo bezbedonosnih smernica.

U ovom tesktu ćemo dati neke savete koje treba da imate na umu kada je u pitanju Node.js bezbednost.

Izbegavajte eval

Ako niste već upoznati, svaki od sledećih izraza u pozadini koristi eval:

setInterval(String, 2)
setTimeout(String, 2)
new Function (String)

Ali zašto biste izbegavali eval?

Eval može da otvori vaš kod za injection napade, a ujedno je i spor (jer pokreće interpreter/kompajler).

Koristite Strict mode

Kao što znate, pomoću strict mode-a birate da radite sa ‘’strožijom’’ varijantom JavaScript-a. Ovaj mod eliminiše neke tihe greške koje mogu da se pojave prilikom pisanja koda.

Statička analiza koda

Za ovu namenu koristite JSLint, JSHint ili ESLint. Statička analiza koda može na vreme otkriti mnogo potencijalnih problema sa vašim kodom.

Ne koristite sudo node app.js

U praksi se često dešava da developeri pokreću svoju Node aplikaciju kao super user-i.

Ovo je jednostavno pogrešno. U slučaju greške/bug-a, vaš proces može srušiti ceo sistem, jer će imati kredencijale da uradi bilo šta.

Umesto toga, naš savet je da podesite HTTP server/proksi da prosleđuje zahteve. Ovo može biti Nginx, Apache ili neki drugi server.

Izbegavajte ubrizgavanje komande (command injection)

Evo jednog primera koda koji potencijalno može da napravi problem

child_process.exec('ls', function (err, data) {
console.log(data);
});

Kao što ste verovatno i sami uočili, child_process.exec poziva da se izvrši /bin/sh, tako da je to bash interpreter a ne pokretač programa.

Ovo je problematično kada se korisnički unos prosleđuje ovom metodu – može biti ili kvačica ili $(), napadač može ubaciti novu komandu.

Da biste prevazišli ovaj problem, jednostavno koristite child_process.execFile.

Temp fajlovi

Obratite posebnu pažnju prilikom kreiranja fajlova, kao što je hendlovanje upload-ovanih fajlova. Ovi fajlovi mogu lako iskoristiti sav prostor na vašem disku.

Da biste rešili ovo, trebalo bi da koristite Streams.

Reflected Cross Site Scripting

Ovo se dešava kada napadač ubaci kod za izvršavanje u HTTP odgovor. Kada je aplikacija ranjiva na ovaj tip napada, ona će klijentu poslati nazad nevalidirani unos (uglavnom napisan u JavaScript-u). To omogućava napadaču da ukrade kolačiće, izvrši krađu clipboard-a i izmeni samu stranicu.

Primer
http://example.com/index.php?user=<script>alert(123)</script>

Ako se string korisničkog upita pošalje nazad klijentu bez validacije i umetne u DOM, biće izvršen.

Kako to sprečiti?
Nikada ne unosite nepouzdane podatke u DOM.

Zaustavljanje krađe kolačića

Podrazumevano, kolačiće može da čita JavaScript na istom domenu. Ovo može biti opasno u slučaju XSS napada. Ali ne samo to: bilo koja third-party JavaScript biblioteka može da ih čita.

Primer
var cookies = document.cookie.split('; ');

Kako to sprečiti?
Da biste to sprečili, možete na kolačiće postaviti flag HttpOnly, što će učiniti vaše kolačiće nedostupnim za Javascript.

Politika bezbednosti sadržaja

Politika bezbednosti sadržaja (Content Security Policy ili CSP) je dodatni sloj bezbednosti koji pomaže u otkrivanju i ublažavanju određenih vrsta napada, uključujući XSS i napade ubrizgavanjem podataka.

CSP se može omogućiti pomoću HTTP zaglavlja Content-Security-Policy.

Primer
Content-Security-Policy: default-src 'self' *.mojdomen.com

Ovo će omogućiti sadržaj sa pouzdanog domena i njegovih poddomena.

Cross-site request forgery

CSRF je napad koji primorava krajnjeg korisnika da izvrši neželjene radnje na web aplikaciji u kojoj je on/ona trenutno autentifikovan.

To se može dogoditi zato što se kolačići šalju sa svakim zahtevom na web sajt , čak i kada ti zahtevi dolaze sa drugog web sajta.

Primer
<body onload="document.forms[0].submit()">
<form method="POST" action="http://yoursite.com/user/delete">
<input type="hidden" name="id" value="123555.">
</form>
</body>

Rezultat gornjeg koda može lako dovesti do brisanja vašeg korisničkog profila.

Kako to sprečiti?
Da biste sprečili CSRF, trebalo bi da primenite obrazac tokena sinhronizatora. Srećom, zajednica okupljena oko Node-a je to već uradila umesto vas.

Alati za upotrebu

npm shrinkwrap: Rekurzivno zaključava dependency verzije i od toga kreira npm-shrinkwrap.json fajl .

retire.js: Cilj Retire.js je da vam pomogne da otkrijete upotrebu verzija modula sa poznatim ranjivostima. Jednostavno instalirajte sa npm install -g retire. Nakon toga, pokretanje sa komandom retire će tražiti ranjivosti u vašem node_modules direktorijumu. (Takođe imajte na umu da retire.js radi ne samo sa node modulima, već i sa front-end bibliotekama).

 

Slični postovi:

Zaštita (hardening) Linux servera
Litespeed server – prednosti i mane
Šta je Log4j (Log4Shell) ranjivost?

Bez komentara

Оставите одговор

Ваша адреса е-поште неће бити објављена.