HelmetJS – zaštita HTTP headera Express.js aplikacija

Sigurnost, jedna od stvari s kojoj svi prilikom razvoja aplikacije govore, ali ju malo njih smatra ozbiljnom ili odgađa za kasnije.

S druge strane, HTTP headeri su nešto što korisnici Express.js aplikacije ne vide i onda je developerima lako zapostaviti ih i gledati na njih kao na nešto nebitno. S obzirom da headeri daju razne informacije koje osobe s lošim namjerama mogu iskoristiti jasno je zašto ipak treba voditi brigu o njima tj. informacijama koje pružaju.

Jedna od tih informacije je X-Powered-By: Express što web pregledniku govori što pokreće aplikaciju tj. na čemu se temelji. Helmet.js će, između ostalog, sakriti ovu informaciju.

Zato je cilj ovog blog posta pokazati kako na brz i jednostavan način zaštititi Express.js aplikaciju koristeći Helmet.js koji neće riješiti sve sigurnosne probleme, ali je ipak odličan početak.

Što je Helmet.js?

Helmet.js je kolekcija od 14 modula koje se brinu za sigurnost HTTP zaglavlja (headers) točnije response headera.

HelmetJS moduli

7 od 14 modula aktiviraju se jednom linijom koda

Osim toga, svaki od tih zadanih modula moguće je individualno aktivirati

ili deaktivirati

Helmet.js moduli

Trenutno postoji 14 modula (defaultni označeni sa (✓)), a to su sljedeći:

1.) contentSecurityPolicy

Sets the Content-Security-Policy header which can help protect against malicious injection of JavaScript, CSS, plugins, and more.

2.) crossdomain

Prevents Adobe Flash and Adobe Acrobat from loading content on your site.

3.) dnsPrefetchControl (✓)

This middleware lets you disable browsers’ DNS prefetching by setting the X-DNS-Prefetch-Control header.

4.) expectCt

Tells browsers to expect Certificate Transparency. For more about Certificate Transparency and this header, see this blog post and the in-progress spec.

5.) featurePolicy

Lets you restrict which browser features can be used. For example, you can disable fullscreen or vibration APIs.

6.) frameguard (✓)

Frameguard mitigates clickjacking attacks by setting the X-Frame-Options header.

7.) hidePoweredBy (✓)

Removes the X-Powered-By header to make it slightly harder for attackers to see what potentially-vulnerable technology powers your site.

8.) hpkp

Helps you set the Public-Key-Pins header to prevent person-in-the-middle attacks. Usage of this header (and therefore this middleware) is not recommended. Be very careful when deploying this—you can easily misuse this header and cause problems. Chrome dropped support for HPKP citing risks of misuse.

9.) hsts (✓)

This module sets the Strict-Transport-Security header to keep your users on HTTPS.

10.) ieNoOpen (✓)

This middleware sets the X-Download-Options to prevent Internet Explorer from executing downloads in your site’s context.

11.) noCache

Aims to disable browser caching by setting several headers.

12.) noSniff (✓)

Helps prevent browsers from trying to guess (“sniff”) the MIME type, which can have security implications. It does this by setting the X-Content-Type-Options header to nosniff.

13.) referrerPolicy

Can control the behavior of the Referer header by setting the Referrer-Policy header.

14.) xssFilter (✓)

Sets the X-XSS-Protection header to prevent reflected XSS attacks.

Kreiranje projekta

Kreiram mapu projekta ExpressHelmet i unutar nje datoteku server.js

HelmetJS i Express.js

sa sljedećim sadržajem:

Detalje o tome kako kreirati osnovni Express.js API moguće je pronaći u blog postu pod naslovom Izrada RESTful API-ja koristeći Node.js i Express.js

Ako sada pokrenem API na adresi http://localhost:8080/api unutar Google Chrome Developer alata pod tabom Network dobit ću sljedeće:

HelmetJS i Express.js Headers

Postavljanje Helmet.js-a

Sljedećom naredbom untuar mape projekta instaliram Hellmet.js

Također, unutar server.js datoteke dodajem sljedeće:

Ako sada pokrenem API na adresi http://localhost:8080/api unutar Google Chrome Developer alata pod tabom Network dobit ću sljedeće:

HelmetJS i Express.js Headers

Na slici iznad mogu se vidjeti headeri kojih ranije nije bilo, a to su:

Također, headere mogu vidjeti i pokretanjem sljedeće naredbe:

Command line curl

Zaključak

Helmet.js nije “all in one” rješenje niti se njegovim postavljenjem unutar projekta može reći da je sigurnosna zaštita aplikacije gotova, ali je svakako dobar početak procesa razmišljanja o sigurnosti.

Node.js resursi

Do sada sam objavio nekoliko blog postova na temu Node.js-a, ali sam odlučio objaviti i ovaj blog post kako bi olakšao pronalazak i pregled svih blog postova vezanih upravo uz Node.js jednako kao što sam to napravio za Angular tj. Ionic Framework.

Ako niste pronašli vama zanimljiv/potreban blog post slobodno ostavite komentar s prijedlogom teme pa ću se potruditi objaviti blog post ili pronaći resurs koji će vam biti od pomoći.

9.) HelmetJS – zaštita HTTP headera Express.js aplikacija (28/10/2018)
8.) Node.js Cron Job – automatsko izvršavanje zakazanih zadataka (26/08/2018)
7.) ExpressJS middleware za ograničavanje ponovljenih zahtjeva na API-je (12/08/2018)
6.) nodemon – automatski restart NodeJS aplikacije (18/02/2018)
5.) Nodemailer & NodeJS – API za slanje emaila (07/07/2018)
4.) Kako napraviti REST API koristeći JSON Server (02/07/2017)
3.) Node.js API za slanje Push notifikacija (05/02/2017)
2.) Node.js RESTful API za upload datoteka (15/01/2017)
1.) Izrada RESTful API-ja koristeći Node.js i Express.js (08/01/2017)

Compodoc – izrada dokumentacije Angular aplikacije

Kada se radi na izradi Angular aplikacija osim poznavanja sintakse važno je imati dobru dokumentaciju kako bi svi uključeni u proces razvoja imali uvid u ono što se i kako radi.

Osim toga, ta se dokumentacija može lijepo iskoristiti prilikom uvođenja novih članova tima koji na jednom mjestu mogu dobiti uvid u sve komponente neke Angular aplikacije.

Compodoc – izrada dokumentacije Angular aplikacije

https://compodoc.app/ služi upravo tome i na jednostavna i brz način pruža automatsku izradu osnovne dokumentacije za Angular aplikacije. Kada kažem osnovne mislim na dio koji se dobije pokretanje jedne naredbe o kojoj će biti riječi u nastavku. Osim toga moguće je dodatno prilagoditi dokumentaciju (npr. izbaciti neke dijelove aplikacije iz dokumentacije) specifičnim potrebama svakog projekta.

Kreiranje aplikacije

Naravno, prije izrade dokumentacije potrebno je imati kreiranu aplikaciju.

Može to biti web aplikacija ili mobilna aplikacija, samo je važno da se u pozadini nalazi Angular.

Za potrebu ovog blog posta iskoristit ću projekt Ionic 3 Start Theme jer se sastoji od puno različitih komponenti što će dobro doći za prikaz dokumentacije.

Ionic 3 Start Theme
Izvor: https://github.com/ionictheme/ionic3-start-theme

Izrada dokumentacije

Unutar mape projekta potrebno je pokrenuti sljedeću naredbu:

U to će se trenutku unutar package.json datoteke pod devDependencies dodati sljedeće:

Osim toga, unutar iste datoteke potrebno je dodati još i sljedeće:

Compodoc help

Sada je sve spremno za generiranje dokumentacije što se radi naredbom:

Compodoc – izrada dokumentacije Angular aplikacije

Nakon izvršenja naredbe pojavit će se mapa documentation.

Compodoc – izrada dokumentacije Angular aplikacije

Dokumentaciju je moguće vidjeti na da načina. Prvi je posjetom na adresu http://127.0.0.1:8080/, a drugi je otvaranjem datoteke documentation/index.html.

Compodoc – izrada dokumentacije Angular aplikacije

Zaključak

Dokumentacija može biti puno konkretnija od ranije prikazanog.

Ostale mogućnosti moguće je pronaći na adresi https://compodoc.app/guides/getting-started.html

Angular KeyValuePipe – prikaz objekta kao niz

U pravilu, kada se žele prikazati neki podaci koristeći *ngFor potrebno je da ti podaci budu u obliku niza (array).

U ovom bi slučaju rješenje izgledalo ovako:

  • Windstorm
  • Bombasto
  • Magneta
  • Tornado

No međutim, ako ti podaci budu u obliku objekta doći će do sljedeće greške (error):

NgFor only supports binding to Iterables such as Arrays

Kako bi se to riješilo Angular 6.1 predstavlja KeyValuePipe.

U tom slučaju sljedeći objekt

Mogu prikazati na ovaj način

Što na kraju izgleda ovako

  • name – Windstorm
  • type – hero
  • rating – 10

Ako se keyvalue pipe pokuša koristiti u nekoj od starijih verzija Angulara doći će do greške što znači da je potrebno nadograditi verziju Angulara na 6.1

The pipe ‘keyvalue’ could not be found

*Naslovna slika preuzeta sa https://orlyapps.de/blog/mobile/einfuhrung-der-neuen-keyvaluepipe-in-angular-61