# Angular
{{#include ../../banners/hacktricks-training.md}}
## Kontrol Listesi
Kontrol Listesi [buradan](https://lsgeurope.com/post/angular-security-checklist).
* [ ] Angular, istemci tarafı bir framework olarak kabul edilir ve sunucu tarafı koruması sağlaması beklenmez
* [ ] Proje yapılandırmasında scriptler için sourcemap devre dışı bırakılmıştır
* [ ] Güvenilmeyen kullanıcı girişi, şablonlarda kullanılmadan önce her zaman interpolasyon veya sanitizasyon işlemine tabi tutulur
* [ ] Kullanıcının sunucu tarafı veya istemci tarafı şablonları üzerinde kontrolü yoktur
* [ ] Güvenilmeyen kullanıcı girişi, uygulama tarafından güvenilir hale getirilmeden önce uygun bir güvenlik bağlamında sanitizasyon işlemine tabi tutulur
* [ ] `BypassSecurity*` yöntemleri güvenilmeyen girdi ile kullanılmaz
* [ ] Güvenilmeyen kullanıcı girişi, `ElementRef`, `Renderer2` ve `Document` gibi Angular sınıflarına veya diğer JQuery/DOM sink'lerine iletilmez
## Angular Nedir
Angular, **güçlü** ve **açık kaynak** bir ön uç framework'tür ve **Google** tarafından bakım yapılmaktadır. Kod okunabilirliğini ve hata ayıklamayı artırmak için **TypeScript** kullanır. Güçlü güvenlik mekanizmaları ile Angular, **XSS** ve **açık yönlendirmeler** gibi yaygın istemci tarafı güvenlik açıklarını önler. Ayrıca **sunucu tarafında** da kullanılabilir, bu nedenle güvenlik dikkate alınması gereken önemli bir konudur **her iki açıdan**.
## Framework mimarisi
Angular temellerini daha iyi anlamak için, temel kavramlarına göz atalım.
Tipik bir Angular projesi genellikle şöyle görünür:
```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
```
Dokümana göre, her Angular uygulaması en az bir bileşene, DOM ile bir bileşen hiyerarisi bağlayan kök bileşen (`AppComponent`) sahiptir. Her bileşen, uygulama verilerini ve mantığını içeren bir sınıf tanımlar ve hedef ortamda görüntülenecek bir görünümü tanımlayan bir HTML şablonuyla ilişkilendirilir. `@Component()` dekoratörü, hemen altındaki sınıfı bir bileşen olarak tanımlar ve şablonu ve ilgili bileşen özel meta verilerini sağlar. `AppComponent`, `app.component.ts` dosyasında tanımlanmıştır.
Angular NgModules, bir uygulama alanına, bir iş akışına veya yakından ilişkili bir yetenekler setine adanmış bir bileşen seti için bir derleme bağlamı bildirir. Her Angular uygulamasının, uygulamayı başlatan bootstrap mekanizmasını sağlayan kök modülü vardır ve bu genellikle `AppModule` olarak adlandırılır. Bir uygulama genellikle birçok işlevsel modül içerir. `AppModule`, `app.module.ts` dosyasında tanımlanmıştır.
Angular `Router` NgModule, uygulamanızdaki farklı uygulama durumları ve görünüm hiyerarileri arasında bir navigasyon yolu tanımlamanıza olanak tanıyan bir hizmet sağlar. `RouterModule`, `app-routing.module.ts` dosyasında tanımlanmıştır.
Belirli bir görünümle ilişkilendirilmemiş ve bileşenler arasında paylaşmak istediğiniz veri veya mantık için bir hizmet sınıfı oluşturursunuz. Bir hizmet sınıfı tanımı, hemen öncesinde `@Injectable()` dekoratörü ile gelir. Dekoratör, diğer sağlayıcıların sınıfınıza bağımlılık olarak enjekte edilmesini sağlayan meta verileri sağlar. Bağımlılık enjeksiyonu (DI), bileşen sınıflarınızı ince ve verimli tutmanıza olanak tanır. Sunucudan veri almazlar, kullanıcı girişini doğrulamazlar veya doğrudan konsola günlüğe kaydetmezler; bu tür görevleri hizmetlere devrederler.
## Sourcemap yapılandırması
Angular çerçevesi, `tsconfig.json` seçeneklerini takip ederek TypeScript dosyalarını JavaScript koduna çevirir ve ardından `angular.json` yapılandırması ile bir proje oluşturur. `angular.json` dosyasına bakıldığında, bir sourcemap'i etkinleştirme veya devre dışı bırakma seçeneği gözlemlenmiştir. Angular dokümantasyonuna göre, varsayılan yapılandırma, betikler için etkinleştirilmiş bir sourcemap dosyasına sahiptir ve varsayılan olarak gizli değildir:
```json
"sourceMap": {
"scripts": true,
"styles": true,
"vendor": false,
"hidden": false
}
```
Genel olarak, sourcemap dosyaları, üretilen dosyaları orijinal dosyalarına eşleştirdikleri için hata ayıklama amaçları için kullanılır. Bu nedenle, bunların bir üretim ortamında kullanılması önerilmez. Eğer sourcemap'ler etkinleştirilirse, okunabilirliği artırır ve Angular projesinin orijinal durumunu kopyalayarak dosya analizine yardımcı olur. Ancak, devre dışı bırakıldığında, bir inceleyici, anti-güvenlik desenlerini arayarak derlenmiş bir JavaScript dosyasını manuel olarak analiz edebilir.
Ayrıca, bir Angular projesine ait derlenmiş bir JavaScript dosyası, tarayıcı geliştirici araçlarında → Sources (veya Debugger ve Sources) → \[id].main.js altında bulunabilir. Etkinleştirilen seçeneklere bağlı olarak, bu dosya sonunda `//# sourceMappingURL=[id].main.js.map` satırını içerebilir veya **hidden** seçeneği **true** olarak ayarlandığında içermeyebilir. Yine de, **scripts** için sourcemap devre dışı bırakıldığında, test daha karmaşık hale gelir ve dosyayı elde edemeyiz. Ayrıca, sourcemap proje derlemesi sırasında `ng build --source-map` gibi etkinleştirilebilir.
## Veri bağlama
Bağlama, bir bileşen ile ilgili görünümü arasındaki iletişim sürecini ifade eder. Angular çerçevesine veri aktarmak için kullanılır. Veriler, olaylar, interpolasyon, özellikler veya iki yönlü bağlama mekanizması gibi çeşitli yollarla iletilebilir. Ayrıca, veriler, ilgili bileşenler (ebeveyn-çocuk ilişkisi) ve iki alakasız bileşen arasında Service özelliği kullanılarak da paylaşılabilir.
Bağlamayı veri akışına göre sınıflandırabiliriz:
* Veri kaynağından görünüm hedefine ( _interpolasyon_, _özellikler_, _nitelikler_, _sınıflar_ ve _stil_ içerir); şablonda `[]` veya `{{}}` kullanılarak uygulanabilir;
* Görünüm hedefine veri kaynağından ( _olaylar_ içerir); şablonda `()` kullanılarak uygulanabilir;
* İki Yönlü; şablonda `[()]` kullanılarak uygulanabilir.
Bağlama, özellikler, olaylar ve nitelikler üzerinde, ayrıca bir kaynak direktifinin herhangi bir genel üyesi üzerinde çağrılabilir:
| TİP | HEDEF | ÖRNEKLER |
| --------- | -------------------------------------------------------- | -------------------------------------------------------------------- |
| Özellik | Eleman özelliği, Bileşen özelliği, Direktif özelliği | \ |
| Olay | Eleman olayı, Bileşen olayı, Direktif olayı | \