# Angular
{{#include ../../banners/hacktricks-training.md}}
## Die Kontrolelys
Kontrolelys [van hier](https://lsgeurope.com/post/angular-security-checklist).
* [ ] Angular word beskou as 'n kliënt-kant raamwerk en word nie verwag om bediener-kant beskerming te bied nie
* [ ] Sourcemap vir skrifte is gedeaktiveer in die projekkonfigurasie
* [ ] Onbetroubare gebruikersinvoer word altyd geïnterpoleer of gesaniteer voordat dit in sjablone gebruik word
* [ ] Die gebruiker het geen beheer oor bediener-kant of kliënt-kant sjablone nie
* [ ] Onbetroubare gebruikersinvoer word gesaniteer met 'n toepaslike sekuriteitskonteks voordat dit deur die aansoek vertrou word
* [ ] `BypassSecurity*` metodes word nie gebruik met onbetroubare invoer nie
* [ ] Onbetroubare gebruikersinvoer word nie aan Angular klasse soos `ElementRef`, `Renderer2` en `Document`, of ander JQuery/DOM sinks oorgedra nie
## Wat is Angular
Angular is 'n **kragtige** en **oopbron** front-end raamwerk wat deur **Google** onderhou word. Dit gebruik **TypeScript** om kode leesbaarheid en foutopsporing te verbeter. Met sterk sekuriteitsmeganismes voorkom Angular algemene kliënt-kant kwesbaarhede soos **XSS** en **oop omleidings**. Dit kan ook aan die **bediener-kant** gebruik word, wat sekuriteitsoorwegings belangrik maak van **albei kante**.
## Raamwerk argitektuur
Om die basiese beginsels van Angular beter te verstaan, kom ons kyk na sy essensiële konsepte.
Gewone Angular projek lyk gewoonlik soos:
```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
```
Volgens die dokumentasie het elke Angular-toepassing ten minste een komponent, die wortelkomponent (`AppComponent`) wat 'n komponenthiërargie met die DOM verbind. Elke komponent definieer 'n klas wat toepassingsdata en -logika bevat, en is geassosieer met 'n HTML-sjabloon wat 'n weergawe definieer wat in 'n teikenomgewing vertoon moet word. Die `@Component()` dekorator identifiseer die klas onmiddellik daaronder as 'n komponent, en verskaf die sjabloon en verwante komponent-spesifieke metadata. Die `AppComponent` is gedefinieer in die `app.component.ts` lêer.
Angular NgModules verklaar 'n kompileringskonteks vir 'n stel komponente wat toegewy is aan 'n toepassingsdomein, 'n werksvloei, of 'n nou verwante stel vermoëns. Elke Angular-toepassing het 'n wortelmodule, konvensioneel genoem `AppModule`, wat die opstartmeganisme verskaf wat die toepassing begin. 'n Toepassing bevat tipies baie funksionele modules. Die `AppModule` is gedefinieer in die `app.module.ts` lêer.
Die Angular `Router` NgModule bied 'n diens wat jou toelaat om 'n navigasiepunt tussen die verskillende toepassingsstate en weergavehiërargieë in jou toepassing te definieer. Die `RouterModule` is gedefinieer in die `app-routing.module.ts` lêer.
Vir data of logika wat nie geassosieer is met 'n spesifieke weergawe nie, en wat jy oor komponente wil deel, skep jy 'n diensklas. 'n Diensklasdefinisie word onmiddellik voorafgegaan deur die `@Injectable()` dekorator. Die dekorator verskaf die metadata wat toelaat dat ander verskaffers as afhanklikhede in jou klas ingespuit kan word. Afhanklikheidsinjeksie (DI) laat jou toe om jou komponentklasse slank en doeltreffend te hou. Hulle haal nie data van die bediener af nie, valideer nie gebruikersinvoer nie, of log nie direk na die konsole nie; hulle delegeer sulke take aan dienste.
## Sourcemap konfigurasie
Die Angular-raamwerk vertaal TypeScript-lêers na JavaScript-kode deur die `tsconfig.json` opsies te volg en bou dan 'n projek met `angular.json` konfigurasie. Kyk na die `angular.json` lêer, het ons 'n opsie opgemerk om 'n sourcemap in te skakel of te deaktiveer. Volgens die Angular-dokumentasie het die standaardkonfigurasie 'n sourcemap-lêer wat vir skrifte geaktiveer is en nie standaard versteek is nie:
```json
"sourceMap": {
"scripts": true,
"styles": true,
"vendor": false,
"hidden": false
}
```
Algemeen word sourcemap-lêers gebruik vir foutopsporing, aangesien hulle gegenereerde lêers aan hul oorspronklike lêers koppel. Daarom word dit nie aanbeveel om hulle in 'n produksie-omgewing te gebruik nie. As sourcemaps geaktiveer is, verbeter dit die leesbaarheid en help dit met lêeranalise deur die oorspronklike toestand van die Angular-projek te herhaal. As hulle egter gedeaktiveer is, kan 'n beoordelaar steeds 'n saamgestelde JavaScript-lêer handmatig analiseer deur te soek na anti-sekuriteitspatrone.
Verder kan 'n saamgestelde JavaScript-lêer met 'n Angular-projek in die blaier ontwikkelaar gereedskap → Bronne (of Foutopsporing en Bronne) → \[id].main.js gevind word. Afhangende van die geaktiveerde opsies, kan hierdie lêer die volgende ry aan die einde bevat `//# sourceMappingURL=[id].main.js.map` of dit mag nie wees nie, as die **hidden** opsie op **true** gestel is. Nietemin, as die sourcemap vir **scripts** gedeaktiveer is, word toetsing meer kompleks, en ons kan nie die lêer verkry nie. Daarbenewens kan sourcemap tydens projekbou geaktiveer word soos `ng build --source-map`.
## Data binding
Binding verwys na die proses van kommunikasie tussen 'n komponent en sy ooreenstemmende weergawe. Dit word gebruik om data na en van die Angular-raamwerk oor te dra. Data kan deur verskeie middele oorgedra word, soos deur gebeurtenisse, interpolasie, eienskappe, of deur die twee-rigting binding meganisme. Boonop kan data ook tussen verwante komponente (ouer-kind verhouding) en tussen twee nie-verwante komponente met behulp van die Diens-funksie gedeel word.
Ons kan binding klassifiseer volgens datastroom:
* Datasoort na weergawe teiken (sluit _interpolasie_, _eienskappe_, _attribuute_, _klasse_ en _style_ in); kan toegepas word deur `[]` of `{{}}` in die sjabloon te gebruik;
* Weergawe teiken na datasoort (sluit _gebeurtenisse_ in); kan toegepas word deur `()` in die sjabloon te gebruik;
* Twee-rigting; kan toegepas word deur `[()]` in die sjabloon te gebruik.
Binding kan op eienskappe, gebeurtenisse en attribuute, sowel as op enige openbare lid van 'n bronrigting genoem word:
| TYPE | TEIKEN | VOORBEELDE |
| --------- | -------------------------------------------------------- | ------------------------------------------------------------------ |
| Eiendom | Element eiendom, Komponent eiendom, Rigting eiendom | \ |
| Gebeurtenis| Element gebeurtenis, Komponent gebeurtenis, Rigting gebeurtenis | \