Nette Documentation Preview

syntax
Ochrona przed podatnością na zagrożenia
***************************************

.[perex]
Co jakiś czas zgłaszana jest dziura w zabezpieczeniach na innej dużej stronie internetowej lub exploit. To jest denerwujące. Jeśli zależy Ci na bezpieczeństwie Twoich aplikacji internetowych, Nette Framework jest z pewnością najlepszym wyborem.


Cross-Site Scripting (XSS) .[#toc-cross-site-scripting-xss]
===========================================================

Cross-Site Scripting to metoda włamywania się na strony internetowe poprzez wykorzystanie nieobsługiwanych danych wyjściowych. Napastnik może wtedy wcisnąć na stronę swój własny kod, co pozwoli mu na modyfikację strony lub nawet uzyskanie wrażliwych danych odwiedzających. Przed XSS można się bronić tylko poprzez konsekwentne i poprawne traktowanie wszystkich ciągów znaków. Wystarczy jednak, że Twój koder pominie ten jeden raz, a cała strona może zostać błyskawicznie skompromitowana.

Przykładem ataku może być podsunięcie przez użytkownika zmodyfikowanego adresu URL w celu wstrzyknięcia swojego kodu na stronę. Gdy aplikacja nie radzi sobie poprawnie z wyjściem, wykonuje skrypt w przeglądarce użytkownika. W ten sposób możemy np. wykraść tożsamość użytkownika.

```
https://example.com/?search=<script>alert('Úspěšný XSS útok.');</script>
```

Nette Framework wyposażony jest w rewolucyjną technologię [Context-Aware Escaping |latte:safety-first#Context-Aware-Escaping], która na zawsze eliminuje ryzyko związane z Cross-Site Scripting. Traktuje wszystkie wyjścia automatycznie, więc nie może się zdarzyć, że koder o czymś zapomni. Przykład? Koder tworzy ten szablon:

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

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

Pisanie `{$message}` oznacza wypisanie zmiennej. W innych frameworkach każdy listing musi być obsługiwany jawnie, a nawet inaczej w każdym miejscu. W Nette Framework nie trzeba niczego leczyć, wszystko odbywa się automatycznie, prawidłowo i konsekwentnie. Jeśli umieścimy `$message = 'Šířka 1/2"'` w zmiennej, framework wygeneruje kod HTML:

```latte
<p onclick="alert(&quot;Šířka 1\/2\&quot;&quot;)">Šířka 1/2&quot;</p>

<script>
document.title = "Šířka 1\/2\"";
</script>
```


Cross-Site Request Forgery (CSRF) .[#toc-cross-site-request-forgery-csrf]
=========================================================================

Atak Cross-Site Request Forgery polega na tym, że napastnik zwabia ofiarę na stronę, która w subtelny sposób wykonuje w przeglądarce ofiary żądanie do serwera, na którym ofiara jest zalogowana, a serwer zakłada, że żądanie zostało wykonane przez ofiarę z własnej woli. Wykonuje więc akcję pod tożsamością ofiary bez jej wiedzy. Może to być zmiana lub usunięcie danych, wysłanie wiadomości itp.

Nette Framework **automatycznie chroni formularze i sygnały w presenterech** przed tego typu atakami. Robi to, uniemożliwiając ich wysyłanie lub wywoływanie z innej domeny. Jeśli chcesz wyłączyć ochronę, użyj poniższego dla formularzy:

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

lub w przypadku sygnału dodać adnotację `@crossOrigin`:

```php
/**
 * @crossOrigin
 */
public function handleXyz()
{
}
```

W PHP 8 można również używać atrybutów:

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

#[CrossOrigin]
public function handleXyz()
{
}
```


Atak na URL, kody kontrolne, nieprawidłowe UTF-8 .[#toc-url-attack-control-codes-invalid-utf-8]
===============================================================================================

Różne terminy związane z napastnikiem próbującym przemycić *szkodliwe* dane do aplikacji internetowej. Konsekwencje mogą być bardzo różnorodne, począwszy od uszkodzonych danych wyjściowych XML (np. zepsute kanały RSS) po uzyskanie wrażliwych informacji z bazy danych lub haseł. Obrona polega na konsekwentnym traktowaniu wszystkich danych wejściowych na poziomie bajt po bajcie. I ręka na sercu, kto z was to robi?

Nette Framework robi to za Ciebie, i to automatycznie. Nie musisz w ogóle niczego ustawiać, a wszystkie dane wejściowe będą traktowane.


Porywanie sesji, kradzież sesji, utrwalanie sesji .[#toc-session-hijacking-session-stealing-session-fixation]
=============================================================================================================

Z porwaniem sesji wiąże się kilka rodzajów ataków. Atakujący kradnie lub psuje identyfikator sesji użytkownika, aby uzyskać dostęp do aplikacji internetowej bez znajomości jego hasła. Może on wtedy zrobić wszystko w aplikacji bez wiedzy użytkownika. Obrona polega na prawidłowym skonfigurowaniu serwera i PHP.

Nette Framework konfiguruje PHP automatycznie. Dzięki temu programista nie musi zastanawiać się jak odpowiednio zabezpieczyć sesję i może w pełni skupić się na tworzeniu aplikacji. Wymaga to jednak włączenia funkcji `ini_set()`.


Plik cookie SameSite .[#toc-samesite-cookie]
============================================

Pliki cookie SameSite zapewniają mechanizm rozpoznawania, co doprowadziło do załadowania strony. Co jest absolutnie niezbędne ze względów bezpieczeństwa.

Flaga SameSite może przyjmować trzy wartości: `Lax`, `Strict` oraz `None` (ta ostatnia wymaga protokołu HTTPS). Jeśli żądanie do strony pochodzi bezpośrednio z serwisu lub użytkownik otwiera stronę wpisując ją bezpośrednio w pasku adresu lub klikając zakładkę, przeglądarka wyśle wszystkie ciasteczka do serwera (czyli z flagami `Lax`, `Strict` oraz `None`). Jeśli użytkownik kliknie na stronę za pośrednictwem linku z innej witryny, do serwera przekazywane są pliki cookie z flagami `Lax` i `None`. Jeśli żądanie odbywa się w inny sposób, np. poprzez przesłanie formularza POST z innej witryny, załadowanie wewnątrz ramki iframe, użycie JavaScript itp, wysyłane są tylko ciasteczka z flagą `None`.

Domyślnie Nette wysyła wszystkie ciasteczka z flagą `Lax`.

{{leftbar: www:@menu-common}}

Ochrona przed podatnością na zagrożenia

Co jakiś czas zgłaszana jest dziura w zabezpieczeniach na innej dużej stronie internetowej lub exploit. To jest denerwujące. Jeśli zależy Ci na bezpieczeństwie Twoich aplikacji internetowych, Nette Framework jest z pewnością najlepszym wyborem.

Cross-Site Scripting (XSS)

Cross-Site Scripting to metoda włamywania się na strony internetowe poprzez wykorzystanie nieobsługiwanych danych wyjściowych. Napastnik może wtedy wcisnąć na stronę swój własny kod, co pozwoli mu na modyfikację strony lub nawet uzyskanie wrażliwych danych odwiedzających. Przed XSS można się bronić tylko poprzez konsekwentne i poprawne traktowanie wszystkich ciągów znaków. Wystarczy jednak, że Twój koder pominie ten jeden raz, a cała strona może zostać błyskawicznie skompromitowana.

Przykładem ataku może być podsunięcie przez użytkownika zmodyfikowanego adresu URL w celu wstrzyknięcia swojego kodu na stronę. Gdy aplikacja nie radzi sobie poprawnie z wyjściem, wykonuje skrypt w przeglądarce użytkownika. W ten sposób możemy np. wykraść tożsamość użytkownika.

https://example.com/?search=<script>alert('Úspěšný XSS útok.');</script>

Nette Framework wyposażony jest w rewolucyjną technologię Context-Aware Escaping, która na zawsze eliminuje ryzyko związane z Cross-Site Scripting. Traktuje wszystkie wyjścia automatycznie, więc nie może się zdarzyć, że koder o czymś zapomni. Przykład? Koder tworzy ten szablon:

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

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

Pisanie {$message} oznacza wypisanie zmiennej. W innych frameworkach każdy listing musi być obsługiwany jawnie, a nawet inaczej w każdym miejscu. W Nette Framework nie trzeba niczego leczyć, wszystko odbywa się automatycznie, prawidłowo i konsekwentnie. Jeśli umieścimy $message = 'Šířka 1/2"' w zmiennej, framework wygeneruje kod HTML:

<p onclick="alert(&quot;Šířka 1\/2\&quot;&quot;)">Šířka 1/2&quot;</p>

<script>
document.title = "Šířka 1\/2\"";
</script>

Cross-Site Request Forgery (CSRF)

Atak Cross-Site Request Forgery polega na tym, że napastnik zwabia ofiarę na stronę, która w subtelny sposób wykonuje w przeglądarce ofiary żądanie do serwera, na którym ofiara jest zalogowana, a serwer zakłada, że żądanie zostało wykonane przez ofiarę z własnej woli. Wykonuje więc akcję pod tożsamością ofiary bez jej wiedzy. Może to być zmiana lub usunięcie danych, wysłanie wiadomości itp.

Nette Framework automatycznie chroni formularze i sygnały w presenterech przed tego typu atakami. Robi to, uniemożliwiając ich wysyłanie lub wywoływanie z innej domeny. Jeśli chcesz wyłączyć ochronę, użyj poniższego dla formularzy:

$form->allowCrossOrigin();

lub w przypadku sygnału dodać adnotację @crossOrigin:

/**
 * @crossOrigin
 */
public function handleXyz()
{
}

W PHP 8 można również używać atrybutów:

use Nette\Application\Attributes\CrossOrigin;

#[CrossOrigin]
public function handleXyz()
{
}

Atak na URL, kody kontrolne, nieprawidłowe UTF-8

Różne terminy związane z napastnikiem próbującym przemycić szkodliwe dane do aplikacji internetowej. Konsekwencje mogą być bardzo różnorodne, począwszy od uszkodzonych danych wyjściowych XML (np. zepsute kanały RSS) po uzyskanie wrażliwych informacji z bazy danych lub haseł. Obrona polega na konsekwentnym traktowaniu wszystkich danych wejściowych na poziomie bajt po bajcie. I ręka na sercu, kto z was to robi?

Nette Framework robi to za Ciebie, i to automatycznie. Nie musisz w ogóle niczego ustawiać, a wszystkie dane wejściowe będą traktowane.

Porywanie sesji, kradzież sesji, utrwalanie sesji

Z porwaniem sesji wiąże się kilka rodzajów ataków. Atakujący kradnie lub psuje identyfikator sesji użytkownika, aby uzyskać dostęp do aplikacji internetowej bez znajomości jego hasła. Może on wtedy zrobić wszystko w aplikacji bez wiedzy użytkownika. Obrona polega na prawidłowym skonfigurowaniu serwera i PHP.

Nette Framework konfiguruje PHP automatycznie. Dzięki temu programista nie musi zastanawiać się jak odpowiednio zabezpieczyć sesję i może w pełni skupić się na tworzeniu aplikacji. Wymaga to jednak włączenia funkcji ini_set().

Pliki cookie SameSite zapewniają mechanizm rozpoznawania, co doprowadziło do załadowania strony. Co jest absolutnie niezbędne ze względów bezpieczeństwa.

Flaga SameSite może przyjmować trzy wartości: Lax, Strict oraz None (ta ostatnia wymaga protokołu HTTPS). Jeśli żądanie do strony pochodzi bezpośrednio z serwisu lub użytkownik otwiera stronę wpisując ją bezpośrednio w pasku adresu lub klikając zakładkę, przeglądarka wyśle wszystkie ciasteczka do serwera (czyli z flagami Lax, Strict oraz None). Jeśli użytkownik kliknie na stronę za pośrednictwem linku z innej witryny, do serwera przekazywane są pliki cookie z flagami Lax i None. Jeśli żądanie odbywa się w inny sposób, np. poprzez przesłanie formularza POST z innej witryny, załadowanie wewnątrz ramki iframe, użycie JavaScript itp, wysyłane są tylko ciasteczka z flagą None.

Domyślnie Nette wysyła wszystkie ciasteczka z flagą Lax.