Nette Documentation Preview

syntax
Ochrona przed podatnościami
***************************

.[perex]
Co jakiś czas na kolejnej znaczącej stronie ogłaszana jest, a nawet wykorzystywana poważna luka bezpieczeństwa. To nieprzyjemne. Jeśli zależy Ci na bezpieczeństwie Twoich aplikacji webowych, Nette Framework jest bez wątpienia najlepszym wyborem.


Cross-Site Scripting (XSS)
==========================

Cross-Site Scripting to metoda zakłócania działania stron przez wykorzystanie nieescapowanych wyjść. Atakujący może wtedy wstrzyknąć na stronę własny kod i tym samym zmodyfikować stronę albo nawet uzyskać wrażliwe dane odwiedzających. Ochrona przed XSS wymaga konsekwentnego i poprawnego escapowania wszystkich wypisywanych ciągów. Jeśli Twój programista zapomni o tym choć raz, cała strona może zostać skompromitowana.

Przykładem ataku może być podanie użytkownikowi zmodyfikowanego URL, który wstrzykuje na stronę kod. Jeśli aplikacja nie escapuje poprawnie wyjść, skrypt wykona się w przeglądarce użytkownika. W ten sposób można na przykład ukraść jego tożsamość.

```
https://example.com/?search=<script>alert('Successful XSS attack.');</script>
```

Nette Framework wprowadza rewolucyjną technologię [Context-Aware Escaping |latte:safety-first#Escapowanie świadome kontekstu], która trwale eliminuje ryzyko Cross-Site Scriptingu. Automatycznie escapuje wszystkie wyjścia zgodnie z kontekstem, więc programista nie może przypadkiem o niczym zapomnieć. Przykład? Programista tworzy taki szablon:

```latte
<p onclick="alert({$message})">{$message}</p>

<script>
document.title = {$message};
</script>
```

Zapis `{$message}` oznacza wypisanie zmiennej. W innych frameworkach trzeba jawnie escapować każde wyjście, i to w każdym miejscu inaczej. W Nette Framework nie trzeba nic escapować, wszystko dzieje się automatycznie, poprawnie i konsekwentnie. Jeśli ustawimy zmienną `$message = 'Width 1/2"'`, framework wygeneruje poniższy kod HTML:

```latte
<p onclick="alert(&quot;Width 1\/2\&quot;&quot;)">Width 1/2&quot;</p>

<script>
document.title = "Width 1\/2\"";
</script>
```


Cross-Site Request Forgery (CSRF)
=================================

Atak Cross-Site Request Forgery polega na tym, że atakujący zwabia ofiarę na stronę, która niepostrzeżenie wykonuje w przeglądarce ofiary żądanie do serwera, na którym ofiara jest zalogowana. Serwer uznaje, że żądanie zostało wykonane dobrowolnie przez ofiarę. Pod tożsamością ofiary wykonuje więc akcję bez jej wiedzy. Może chodzić o zmianę albo usunięcie danych, wysłanie wiadomości itd.

Nette Framework **automatycznie chroni formularze i sygnały w presenterach** przed tym typem ataku, uniemożliwiając ich wysłanie albo wywołanie z innej domeny. Jeśli chcesz ochronę wyłączyć, dla formularzy użyj:

```php
$form->allowCrossOrigin();
```

albo w przypadku sygnału dodaj atrybut:

```php
use Nette\Application\Attributes\Requires;

#[Requires(sameOrigin: false)]
public function handleXyz()
{
}
```

Ochrona ta opiera się na nagłówku `Sec-Fetch-Site` (Fetch Metadata), który przeglądarka wysyła automatycznie i którego nie da się podrobić nawet przy podatności XSS po stronie serwera. Szczegółowo opisuje to artykuł [Przeglądarka wreszcie rozwiązuje CSRF |https://blog.nette.org/en/quarter-century-of-csrf].


Atak przez URL, kody sterujące, nieprawidłowe UTF-8
===================================================

Różne określenia związane z próbą wstrzyknięcia przez atakującego *złośliwego* wejścia do Twojej aplikacji webowej. Konsekwencje mogą być bardzo różne, od uszkodzenia wyjść XML (np. niedziałających kanałów RSS) po uzyskanie wrażliwych informacji z bazy danych albo haseł. Obroną jest konsekwentna walidacja wszystkich wejść na poziomie bajtów. I powiedzmy sobie szczerze, ilu z was faktycznie to robi?

Nette Framework robi to za Ciebie, automatycznie. Nie musisz niczego konfigurować, a wszystkie wejścia zostaną oczyszczone.


Session Hijacking, Session Stealing, Session Fixation
=====================================================

Z zarządzaniem sesją wiąże się kilka typów ataków. Atakujący albo kradnie, albo podstawia użytkownikowi swoje session ID, uzyskując w ten sposób dostęp do aplikacji webowej bez znajomości hasła użytkownika. Może potem wykonać w aplikacji dowolną akcję bez wiedzy użytkownika. Obrona polega na właściwej konfiguracji serwera i PHP.

Nette Framework konfiguruje PHP automatycznie. Programista nie musi więc myśleć o tym, jak właściwie zabezpieczyć sesję, i może w pełni skupić się na tworzeniu aplikacji. Wymaga to jednak, żeby funkcja `ini_set()` była włączona.


Cookie SameSite
===============

Cookies SameSite dają mechanizm rozpoznawania tego, co doprowadziło do wczytania strony, co ma kluczowe znaczenie dla bezpieczeństwa.

Flaga SameSite może mieć trzy wartości: `Lax`, `Strict` i `None` (ta ostatnia wymaga HTTPS). Jeśli żądanie strony przychodzi bezpośrednio z witryny albo użytkownik otwiera stronę, wpisując ją bezpośrednio w pasku adresu czy klikając w zakładkę, przeglądarka wysyła na serwer wszystkie cookies (czyli z flagami `Lax`, `Strict` i `None`). Jeśli użytkownik przejdzie na witrynę odnośnikiem z innej strony, na serwer przekazywane są cookies z flagami `Lax` i `None`. Jeśli żądanie powstaje w inny sposób, na przykład przez wysłanie formularza POST z innego origin, wczytanie wewnątrz iframe'a, użycie JavaScriptu itd., wysyłane są tylko cookies z flagą `None`.

Nette domyślnie wysyła wszystkie cookies z flagą `Lax`.

Ochrona przed podatnościami

Co jakiś czas na kolejnej znaczącej stronie ogłaszana jest, a nawet wykorzystywana poważna luka bezpieczeństwa. To nieprzyjemne. Jeśli zależy Ci na bezpieczeństwie Twoich aplikacji webowych, Nette Framework jest bez wątpienia najlepszym wyborem.

Cross-Site Scripting (XSS)

Cross-Site Scripting to metoda zakłócania działania stron przez wykorzystanie nieescapowanych wyjść. Atakujący może wtedy wstrzyknąć na stronę własny kod i tym samym zmodyfikować stronę albo nawet uzyskać wrażliwe dane odwiedzających. Ochrona przed XSS wymaga konsekwentnego i poprawnego escapowania wszystkich wypisywanych ciągów. Jeśli Twój programista zapomni o tym choć raz, cała strona może zostać skompromitowana.

Przykładem ataku może być podanie użytkownikowi zmodyfikowanego URL, który wstrzykuje na stronę kod. Jeśli aplikacja nie escapuje poprawnie wyjść, skrypt wykona się w przeglądarce użytkownika. W ten sposób można na przykład ukraść jego tożsamość.

https://example.com/?search=<script>alert('Successful XSS attack.');</script>

Nette Framework wprowadza rewolucyjną technologię Context-Aware Escaping, która trwale eliminuje ryzyko Cross-Site Scriptingu. Automatycznie escapuje wszystkie wyjścia zgodnie z kontekstem, więc programista nie może przypadkiem o niczym zapomnieć. Przykład? Programista tworzy taki szablon:

<p onclick="alert({$message})">{$message}</p>

<script>
document.title = {$message};
</script>

Zapis {$message} oznacza wypisanie zmiennej. W innych frameworkach trzeba jawnie escapować każde wyjście, i to w każdym miejscu inaczej. W Nette Framework nie trzeba nic escapować, wszystko dzieje się automatycznie, poprawnie i konsekwentnie. Jeśli ustawimy zmienną $message = 'Width 1/2"', framework wygeneruje poniższy kod HTML:

<p onclick="alert(&quot;Width 1\/2\&quot;&quot;)">Width 1/2&quot;</p>

<script>
document.title = "Width 1\/2\"";
</script>

Cross-Site Request Forgery (CSRF)

Atak Cross-Site Request Forgery polega na tym, że atakujący zwabia ofiarę na stronę, która niepostrzeżenie wykonuje w przeglądarce ofiary żądanie do serwera, na którym ofiara jest zalogowana. Serwer uznaje, że żądanie zostało wykonane dobrowolnie przez ofiarę. Pod tożsamością ofiary wykonuje więc akcję bez jej wiedzy. Może chodzić o zmianę albo usunięcie danych, wysłanie wiadomości itd.

Nette Framework automatycznie chroni formularze i sygnały w presenterach przed tym typem ataku, uniemożliwiając ich wysłanie albo wywołanie z innej domeny. Jeśli chcesz ochronę wyłączyć, dla formularzy użyj:

$form->allowCrossOrigin();

albo w przypadku sygnału dodaj atrybut:

use Nette\Application\Attributes\Requires;

#[Requires(sameOrigin: false)]
public function handleXyz()
{
}

Ochrona ta opiera się na nagłówku Sec-Fetch-Site (Fetch Metadata), który przeglądarka wysyła automatycznie i którego nie da się podrobić nawet przy podatności XSS po stronie serwera. Szczegółowo opisuje to artykuł Przeglądarka wreszcie rozwiązuje CSRF.

Atak przez URL, kody sterujące, nieprawidłowe UTF-8

Różne określenia związane z próbą wstrzyknięcia przez atakującego złośliwego wejścia do Twojej aplikacji webowej. Konsekwencje mogą być bardzo różne, od uszkodzenia wyjść XML (np. niedziałających kanałów RSS) po uzyskanie wrażliwych informacji z bazy danych albo haseł. Obroną jest konsekwentna walidacja wszystkich wejść na poziomie bajtów. I powiedzmy sobie szczerze, ilu z was faktycznie to robi?

Nette Framework robi to za Ciebie, automatycznie. Nie musisz niczego konfigurować, a wszystkie wejścia zostaną oczyszczone.

Session Hijacking, Session Stealing, Session Fixation

Z zarządzaniem sesją wiąże się kilka typów ataków. Atakujący albo kradnie, albo podstawia użytkownikowi swoje session ID, uzyskując w ten sposób dostęp do aplikacji webowej bez znajomości hasła użytkownika. Może potem wykonać w aplikacji dowolną akcję bez wiedzy użytkownika. Obrona polega na właściwej konfiguracji serwera i PHP.

Nette Framework konfiguruje PHP automatycznie. Programista nie musi więc myśleć o tym, jak właściwie zabezpieczyć sesję, i może w pełni skupić się na tworzeniu aplikacji. Wymaga to jednak, żeby funkcja ini_set() była włączona.

Cookies SameSite dają mechanizm rozpoznawania tego, co doprowadziło do wczytania strony, co ma kluczowe znaczenie dla bezpieczeństwa.

Flaga SameSite może mieć trzy wartości: Lax, Strict i None (ta ostatnia wymaga HTTPS). Jeśli żądanie strony przychodzi bezpośrednio z witryny albo użytkownik otwiera stronę, wpisując ją bezpośrednio w pasku adresu czy klikając w zakładkę, przeglądarka wysyła na serwer wszystkie cookies (czyli z flagami Lax, Strict i None). Jeśli użytkownik przejdzie na witrynę odnośnikiem z innej strony, na serwer przekazywane są cookies z flagami Lax i None. Jeśli żądanie powstaje w inny sposób, na przykład przez wysłanie formularza POST z innego origin, wczytanie wewnątrz iframe'a, użycie JavaScriptu itd., wysyłane są tylko cookies z flagą None.

Nette domyślnie wysyła wszystkie cookies z flagą Lax.