# Angular
## The Checklist
Checklist [from here](https://lsgeurope.com/post/angular-security-checklist).
* [ ] Angular вважається фреймворком на стороні клієнта і не очікується, що він забезпечить захист на стороні сервера
* [ ] Sourcemap для скриптів вимкнено в конфігурації проекту
* [ ] Ненадійний ввід користувача завжди інтерполюється або очищається перед використанням у шаблонах
* [ ] Користувач не має контролю над шаблонами на стороні сервера або клієнта
* [ ] Ненадійний ввід користувача очищається з використанням відповідного контексту безпеки перед тим, як бути довіреним додатком
* [ ] `BypassSecurity*` методи не використовуються з ненадійним ввідом
* [ ] Ненадійний ввід користувача не передається в класи Angular, такі як `ElementRef`, `Renderer2` та `Document`, або інші JQuery/DOM sinks
## What is Angular
Angular є **потужним** і **відкритим** фреймворком для фронтенду, який підтримується **Google**. Він використовує **TypeScript** для покращення читабельності коду та налагодження. Завдяки сильним механізмам безпеки, Angular запобігає поширеним вразливостям на стороні клієнта, таким як **XSS** та **відкриті перенаправлення**. Його також можна використовувати на **стороні сервера**, що робить питання безпеки важливими з **обох сторін**.
## Framework architecture
In order to better understand the Angular basics, let’s go through its essential concepts.
Common Angular project usually looks like:
```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
```
Згідно з документацією, кожен Angular-додаток має принаймні один компонент, кореневий компонент (`AppComponent`), який з'єднує ієрархію компонентів з DOM. Кожен компонент визначає клас, який містить дані та логіку додатка, і асоційований з HTML-шаблоном, який визначає вигляд, що має бути відображений у цільовому середовищі. Декоратор `@Component()` ідентифікує клас безпосередньо під ним як компонент і надає шаблон та відповідну специфічну метадані компонента. `AppComponent` визначено у файлі `app.component.ts`.
Angular NgModules оголошують контекст компіляції для набору компонентів, який присвячений домену додатка, робочому процесу або тісно пов'язаному набору можливостей. Кожен Angular-додаток має кореневий модуль, звичайно названий `AppModule`, який надає механізм завантаження, що запускає додаток. Додаток зазвичай містить багато функціональних модулів. `AppModule` визначено у файлі `app.module.ts`.
NgModule Angular `Router` надає сервіс, який дозволяє визначити навігаційний шлях серед різних станів додатка та ієрархій виглядів у вашому додатку. `RouterModule` визначено у файлі `app-routing.module.ts`.
Для даних або логіки, які не пов'язані з конкретним виглядом і які ви хочете поділитися між компонентами, ви створюєте клас сервісу. Визначення класу сервісу безпосередньо передує декоратору `@Injectable()`. Декоратор надає метадані, які дозволяють іншим провайдерам бути впровадженими як залежності у ваш клас. Впровадження залежностей (DI) дозволяє зберігати ваші класи компонентів стрункими та ефективними. Вони не отримують дані з сервера, не перевіряють введення користувача і не ведуть безпосередній лог до консолі; вони делегують такі завдання сервісам.
## Налаштування sourcemap
Фреймворк Angular перекладає файли TypeScript у JavaScript-код, дотримуючись параметрів `tsconfig.json`, а потім будує проект з конфігурацією `angular.json`. Розглядаючи файл `angular.json`, ми спостерігали опцію для увімкнення або вимкнення sourcemap. Згідно з документацією Angular, за замовчуванням конфігурація має файл sourcemap, увімкнений для скриптів, і за замовчуванням не прихований:
```json
"sourceMap": {
"scripts": true,
"styles": true,
"vendor": false,
"hidden": false
}
```
Загалом, файли sourcemap використовуються для налагодження, оскільки вони відображають згенеровані файли на їх оригінальні файли. Тому не рекомендується використовувати їх у виробничому середовищі. Якщо sourcemaps увімкнено, це покращує читабельність і допомагає в аналізі файлів, відтворюючи оригінальний стан проекту Angular. Однак, якщо вони вимкнені, рецензент все ще може вручну проаналізувати скомпільований JavaScript файл, шукаючи антибезпекові шаблони.
Більш того, скомпільований JavaScript файл з проектом Angular можна знайти в інструментах розробника браузера → Sources (або Debugger і Sources) → \[id].main.js. Залежно від увімкнених опцій, цей файл може містити наступний рядок в кінці `//# sourceMappingURL=[id].main.js.map` або може не містити, якщо опція **hidden** встановлена на **true**. Проте, якщо sourcemap вимкнено для **scripts**, тестування стає більш складним, і ми не можемо отримати файл. Крім того, sourcemap може бути увімкнено під час збірки проекту, наприклад, `ng build --source-map`.
## Прив'язка даних
Прив'язка відноситься до процесу комунікації між компонентом і відповідним виглядом. Вона використовується для передачі даних до та з фреймворку Angular. Дані можуть передаватися різними способами, такими як через події, інтерполяцію, властивості або через механізм двосторонньої прив'язки. Більш того, дані також можуть бути спільними між пов'язаними компонентами (відношення батька і дитини) та між двома непов'язаними компонентами за допомогою функції Service.
Ми можемо класифікувати прив'язку за потоком даних:
* Джерело даних до цільового вигляду (включає _інтерполяцію_, _властивості_, _атрибути_, _класи_ та _стилі_); може бути застосовано за допомогою `[]` або `{{}}` у шаблоні;
* Цільовий вигляд до джерела даних (включає _події_); може бути застосовано за допомогою `()` у шаблоні;
* Двостороння; може бути застосовано за допомогою `[()]` у шаблоні.
Прив'язка може бути викликана на властивостях, подіях і атрибутах, а також на будь-якому публічному члені директиви джерела:
| TYPE | TARGET | EXAMPLES |
| --------- | -------------------------------------------------------- | -------------------------------------------------------------------- |
| Property | Властивість елемента, Властивість компонента, Властивість директиви | \ |
| Event | Подія елемента, Подія компонента, Подія директиви | \