# Angular
## Lista kontrolna
Lista kontrolna [znajduje się tutaj](https://lsgeurope.com/post/angular-security-checklist).
* [ ] Angular jest uważany za framework po stronie klienta i nie zapewnia ochrony po stronie serwera
* [ ] Mapy źródłowe dla skryptów są wyłączone w konfiguracji projektu
* [ ] Niezaufane dane wprowadzane przez użytkownika są zawsze interpolowane lub oczyszczane przed użyciem w szablonach
* [ ] Użytkownik nie ma kontroli nad szablonami po stronie serwera ani po stronie klienta
* [ ] Niezaufane dane wprowadzane przez użytkownika są oczyszczane przy użyciu odpowiedniego kontekstu bezpieczeństwa przed zaufaniem przez aplikację
* [ ] Metody `BypassSecurity*` nie są używane z niezaufanymi danymi wejściowymi
* [ ] Niezaufane dane wprowadzane przez użytkownika nie są przekazywane do klas Angulara, takich jak `ElementRef`, `Renderer2` i `Document`, ani do innych źródeł danych JQuery/DOM
## Czym jest Angular
Angular to **potężny** i **open-source'owy** framework front-endowy utrzymywany przez **Google**. Wykorzystuje **TypeScript** do poprawy czytelności kodu i debugowania. Dzięki silnym mechanizmom bezpieczeństwa, Angular zapobiega powszechnym podatnościom po stronie klienta, takim jak **XSS** i **przekierowania**. Może być również używany po stronie serwera, co sprawia, że rozważania dotyczące bezpieczeństwa są ważne z **obu stron**.
## Architektura frameworka
Aby lepiej zrozumieć podstawy Angulara, przejdźmy przez jego podstawowe koncepcje.
Przykładowy projekt Angulara zwykle wygląda tak:
```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
```
Według dokumentacji, każda aplikacja Angularowa ma co najmniej jeden komponent, którym jest komponent główny (`AppComponent`), łączący hierarchię komponentów z DOM-em. Każdy komponent definiuje klasę zawierającą dane i logikę aplikacji, oraz jest powiązany z szablonem HTML, który definiuje widok do wyświetlenia w docelowym środowisku. Dekorator `@Component()` identyfikuje klasę poniżej niego jako komponent i dostarcza szablon oraz powiązane metadane specyficzne dla komponentu. `AppComponent` jest zdefiniowany w pliku `app.component.ts`.
Moduły Angulara (`NgModules`) deklarują kontekst kompilacji dla zestawu komponentów, który jest dedykowany dla domeny aplikacji, procesu pracy lub zestawu powiązanych możliwości. Każda aplikacja Angularowa ma moduł główny, zazwyczaj nazwany `AppModule`, który zapewnia mechanizm uruchamiania aplikacji. Aplikacja zazwyczaj zawiera wiele modułów funkcjonalnych. `AppModule` jest zdefiniowany w pliku `app.module.ts`.
Moduł `Router` w Angularze dostarcza usługę, która umożliwia definiowanie ścieżki nawigacji między różnymi stanami aplikacji i hierarchiami widoków w aplikacji. `RouterModule` jest zdefiniowany w pliku `app-routing.module.ts`.
Jeśli chcesz udostępnić dane lub logikę, która nie jest powiązana z konkretnym widokiem i którą chcesz udostępnić między komponentami, tworzysz klasę usługi. Definicja klasy usługi jest poprzedzona dekoratorem `@Injectable()`. Dekorator dostarcza metadane, które umożliwiają wstrzykiwanie innych dostawców jako zależności do twojej klasy. Wstrzykiwanie zależności (DI) pozwala utrzymać lekkie i wydajne klasy komponentów. Nie pobierają one danych z serwera, nie sprawdzają poprawności wprowadzanych danych użytkownika ani nie logują bezpośrednio do konsoli; te zadania delegują do usług.
## Konfiguracja sourcemap
Framework Angular przekształca pliki TypeScript na kod JavaScript, stosując opcje z pliku `tsconfig.json`, a następnie buduje projekt z konfiguracją z pliku `angular.json`. Przeglądając plik `angular.json`, zauważyliśmy opcję umożliwiającą włączanie lub wyłączanie sourcemap. Według dokumentacji Angulara, domyślna konfiguracja ma włączony plik sourcemap dla skryptów i nie jest domyślnie ukryty:
```json
"sourceMap": {
"scripts": true,
"styles": true,
"vendor": false,
"hidden": false
}
```
## Mapy źródłowe
Pliki sourcemap są używane głównie do celów debugowania, ponieważ mapują wygenerowane pliki na ich oryginalne pliki. Dlatego nie zaleca się ich używania w środowisku produkcyjnym. Jeśli sourcemapy są włączone, poprawiają czytelność i ułatwiają analizę plików, odtwarzając pierwotny stan projektu Angular. Jednak jeśli są wyłączone, recenzent nadal może ręcznie analizować skompilowany plik JavaScript, szukając wzorców antybezpieczeństwa.
Ponadto, skompilowany plik JavaScript z projektem Angular można znaleźć w narzędziach deweloperskich przeglądarki → Źródła (lub Debugger i Źródła) → \[id].main.js. W zależności od włączonych opcji, ten plik może zawierać następujący wiersz na końcu `//# sourceMappingURL=[id].main.js.map` lub może go nie zawierać, jeśli opcja **hidden** jest ustawiona na **true**. Niemniej jednak, jeśli sourcemap jest wyłączony dla **skryptów**, testowanie staje się bardziej skomplikowane i nie możemy uzyskać pliku. Ponadto, sourcemap można włączyć podczas budowania projektu, używając `ng build --source-map`.
## Wiązanie danych
Wiązanie odnosi się do procesu komunikacji między komponentem a odpowiadającym mu widokiem. Jest używane do przesyłania danych do i z frameworka Angular. Dane mogą być przekazywane na różne sposoby, takie jak za pomocą zdarzeń, interpolacji, właściwości lub za pomocą mechanizmu dwukierunkowego wiązania. Ponadto, dane mogą być również udostępniane między powiązanymi komponentami (relacja rodzic-dziecko) oraz między dwoma niepowiązanymi komponentami za pomocą funkcji usługi.
Możemy sklasyfikować wiązanie według przepływu danych:
* Dane źródłowe do celu widoku (obejmuje _interpolację_, _właściwości_, _atrybuty_, _klasy_ i _style_); można je zastosować za pomocą `[]` lub `{{}}` w szablonie;
* Cel widoku do źródła danych (obejmuje _zdarzenia_); można je zastosować za pomocą `()` w szablonie;
* Dwukierunkowe; można je zastosować za pomocą `[()]` w szablonie.
Wiązanie można stosować do właściwości, zdarzeń i atrybutów, a także do dowolnego publicznego elementu członkowskiego dyrektywy źródłowej:
| TYP | CEL | PRZYKŁADY |
| --------- | -------------------------------------------------------- | -------------------------------------------------------------------- |
| Właściwość | Właściwość elementu, Właściwość komponentu, Właściwość dyrektywy | \ |
| Zdarzenie | Zdarzenie elementu, Zdarzenie komponentu, Zdarzenie dyrektywy | \