# Angular
## Lista za proveru
Lista za proveru [ovde](https://lsgeurope.com/post/angular-security-checklist).
* [ ] Angular se smatra klijentskim okvirom i ne očekuje se da pruža zaštitu na serverskoj strani
* [ ] Sourcemap za skripte je onemogućen u konfiguraciji projekta
* [ ] Nepouzdan unos korisnika uvek se interpolira ili sanitizuje pre upotrebe u šablonima
* [ ] Korisnik nema kontrolu nad serverskim ili klijentskim šablonima
* [ ] Nepouzdan unos korisnika se sanitizuje koristeći odgovarajući bezbednosni kontekst pre nego što ga aplikacija smatra pouzdanim
* [ ] Metode `BypassSecurity*` se ne koriste sa nepouzdanim unosom
* [ ] Nepouzdan unos korisnika se ne prosleđuje Angular klasama kao što su `ElementRef`, `Renderer2` i `Document`, ili drugim JQuery/DOM izvorima
## Šta je Angular
Angular je **moćan** i **open-source** front-end okvir održavan od strane **Google-a**. Koristi **TypeScript** za poboljšanje čitljivosti i debagiranja koda. Sa snažnim mehanizmima bezbednosti, Angular sprečava uobičajene ranjivosti na klijentskoj strani kao što su **XSS** i **otvorena preusmeravanja**. Može se koristiti i na serverskoj strani, što čini bezbednosne razmatranja važnim sa **obe strane**.
## Arhitektura okvira
Da bismo bolje razumeli osnove Angulara, prođimo kroz njegove osnovne koncepte.
Tipičan Angular projekat obično izgleda ovako:
```bash
my-workspace/
├── ... #workspace-wide configuration files
├── src
│ ├── app
│ │ ├── app.module.ts #defines the root module, that tells Angular how to assemble the application
│ │ ├── app.component.ts #defines the logic for the application's root component
│ │ ├── app.component.html #defines the HTML template associated with the root component
│ │ ├── app.component.css #defines the base CSS stylesheet for the root component
│ │ ├── app.component.spec.ts #defines a unit test for the root component
│ │ └── app-routing.module.ts #provides routing capability for the application
│ ├── lib
│ │ └── src #library-specific configuration files
│ ├── index.html #main HTML page, where the component will be rendered in
│ └── ... #application-specific configuration files
├── angular.json #provides workspace-wide and project-specific configuration defaults
└── tsconfig.json #provides the base TypeScript configuration for projects in the workspace
```
Prema dokumentaciji, svaka Angular aplikacija ima barem jednu komponentu, glavnu komponentu (`AppComponent`) koja povezuje hijerarhiju komponenti sa DOM-om. Svaka komponenta definiše klasu koja sadrži podatke i logiku aplikacije, i povezana je sa HTML šablonom koji definiše prikaz koji će se prikazati u ciljnom okruženju. Dekorator `@Component()` identifikuje klasu ispod njega kao komponentu i pruža šablon i povezane metapodatke specifične za komponentu. `AppComponent` je definisan u fajlu `app.component.ts`.
Angular NgModules deklarišu kontekst kompilacije za skup komponenti koji je posvećen domenu aplikacije, radnom toku ili tesno povezanom skupu mogućnosti. Svaka Angular aplikacija ima glavni modul, konvencionalno nazvan `AppModule`, koji pruža mehanizam za pokretanje aplikacije. Aplikacija obično sadrži mnogo funkcionalnih modula. `AppModule` je definisan u fajlu `app.module.ts`.
NgModule `Router` u Angularu pruža uslugu koja vam omogućava da definišete put navigacije između različitih stanja aplikacije i hijerarhija prikaza u vašoj aplikaciji. `RouterModule` je definisan u fajlu `app-routing.module.ts`.
Za podatke ili logiku koja nije povezana sa određenim prikazom, a koju želite deliti između komponenti, kreirate klasu servisa. Definicija klase servisa odmah je prethodena dekoratorom `@Injectable()`. Dekorator pruža metapodatke koji omogućavaju da se drugi provajderi ubace kao zavisnosti u vašu klasu. Ubacivanje zavisnosti (DI) omogućava vam da zadržite vitke i efikasne klase komponenti. One ne preuzimaju podatke sa servera, ne validiraju korisnički unos ili ne beleže direktno u konzolu; te zadatke delegiraju servisima.
## Konfiguracija sourcemap-a
Angular okvir prevodi TypeScript fajlove u JavaScript kod prateći opcije `tsconfig.json` i zatim gradi projekat sa konfiguracijom `angular.json`. Pregledajući fajl `angular.json`, primetili smo opciju za omogućavanje ili onemogućavanje sourcemap-a. Prema Angular dokumentaciji, podrazumevana konfiguracija ima omogućen fajl sourcemap-a za skripte i podrazumevano nije sakriven:
```json
"sourceMap": {
"scripts": true,
"styles": true,
"vendor": false,
"hidden": false
}
```
Općenito, datoteke sourcemap se koriste u svrhe otklanjanja grešaka jer mapiraju generirane datoteke s njihovim izvornim datotekama. Stoga se ne preporučuje njihova upotreba u produkcijskom okruženju. Ako su sourcemaps omogućene, poboljšava se čitljivost i olakšava analiza datoteka repliciranjem izvornog stanja Angular projekta. Međutim, ako su onemogućene, recenzent i dalje može ručno analizirati kompiliranu JavaScript datoteku tražeći anti-sigurnosne obrasce.
Osim toga, kompilirana JavaScript datoteka s Angular projektom može se pronaći u alatima za razvoj preglednika → Izvori (ili Debugger i Izvori) → \[id].main.js. Ovisno o omogućenim opcijama, ova datoteka može sadržavati sljedeći redak na kraju `//# sourceMappingURL=[id].main.js.map` ili ne mora, ako je postavljena opcija **hidden** na **true**. Međutim, ako je sourcemap onemogućen za **skripte**, testiranje postaje složenije i ne možemo dobiti datoteku. Osim toga, sourcemap se može omogućiti tijekom izgradnje projekta kao `ng build --source-map`.
## Povezivanje podataka
Povezivanje se odnosi na proces komunikacije između komponente i odgovarajućeg prikaza. Koristi se za prijenos podataka u i iz Angular okvira. Podaci se mogu prenositi na različite načine, kao što su putem događaja, interpolacije, svojstava ili putem mehanizma dvosmjernog povezivanja. Osim toga, podaci se mogu dijeliti između povezanih komponenti (roditelj-dijete odnos) i između dvije nesrodne komponente pomoću značajke Servis.
Povezivanje možemo klasificirati prema toku podataka:
* Izvor podataka prema cilju prikaza (uključuje _interpolaciju_, _svojstva_, _atribute_, _klase_ i _stilove_); može se primijeniti korištenjem `[]` ili `{{}}` u predlošku;
* Cilj prikaza prema izvoru podataka (uključuje _događaje_); može se primijeniti korištenjem `()` u predlošku;
* Dvosmjerno; može se primijeniti korištenjem `[()]` u predlošku.
Povezivanje se može primijeniti na svojstva, događaje i atribute, kao i na bilo koji javni član izvorne direktive:
| TIP | CILJ | PRIMJERI |
| --------- | -------------------------------------------------------- | -------------------------------------------------------------------- |
| Svojstvo | Svojstvo elementa, svojstvo komponente, svojstvo direktive | \ |
| Događaj | Događaj elementa, događaj komponente, događaj direktive | \