Ochrona przed podatnościami

Co chwilę zgłaszana jest luka bezpieczeństwa na kolejnej ważnej stronie internetowej lub luka jest wykorzystywana. To nieprzyjemne. 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 naruszania stron internetowych wykorzystująca nieprzetworzone dane wyjściowe. Atakujący może wstrzyknąć do strony swój własny kod, co pozwala mu zmodyfikować stronę lub nawet uzyskać poufne dane o odwiedzających. Przed XSS można się bronić tylko poprzez konsekwentne i poprawne przetwarzanie (escapowanie) wszystkich ciągów znaków. Wystarczy jednak, że Twój koder tylko raz o tym zapomni, a cała strona może zostać natychmiast skompromitowana.

Przykładem ataku może być podsunięcie użytkownikowi zmodyfikowanego adresu URL, za pomocą którego wstrzykujemy do strony swój kod. Jeśli aplikacja nie będzie odpowiednio przetwarzać danych wyjściowych, wykona skrypt w przeglądarce użytkownika. W ten sposób możemy na przykład ukraść jego tożsamość.

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

Nette Framework wprowadza rewolucyjną technologię Context-Aware Escaping, która na zawsze uwolni Cię od ryzyka Cross-Site Scriptingu. Wszystkie dane wyjściowe są bowiem przetwarzane 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>

Zapis {$message} oznacza wypisanie zmiennej. W innych frameworkach konieczne jest jawne przetworzenie każdego wypisania, a nawet w każdym miejscu inaczej. W Nette Framework nie trzeba niczego przetwarzać, wszystko dzieje się automatycznie, poprawnie i konsekwentnie. Jeśli podstawimy do zmiennej $message = 'Szerokość 1/2"', framework wygeneruje kod HTML:

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

<script>
document.title = "Szerokość 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 w przeglądarce ofiary wykonuje żądanie do serwera, na którym ofiara jest zalogowana, a serwer zakłada, że żądanie zostało wykonane przez ofiarę z własnej woli. W ten sposób pod tożsamością ofiary wykonuje określoną czynność, o której ofiara nie wie. Może to być zmiana lub usunięcie danych, wysłanie wiadomości itp.

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

$form->allowCrossOrigin();

lub w przypadku sygnału dodaj adnotację @crossOrigin:

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

W Nette Application 3.2 możesz również użyć atrybutów:

use Nette\Application\Attributes\Requires;

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

Ataki URL, kody kontrolne, nieprawidłowe UTF-8

Różne pojęcia związane z próbą podsunięcia przez atakującego Twojej aplikacji internetowej szkodliwych danych wejściowych. Skutki mogą być bardzo różnorodne, od uszkodzenia danych wyjściowych XML (np. niedziałające kanały RSS) po uzyskanie poufnych informacji z bazy danych lub haseł. Obroną jest konsekwentne przetwarzanie wszystkich danych wejściowych na poziomie poszczególnych bajtów. A szczerze mówiąc, kto z Was to robi?

Nette Framework robi to za Ciebie i dodatkowo automatycznie. Nie musisz niczego konfigurować, a wszystkie dane wejściowe będą przetworzone.

Session hijacking, session stealing, session fixation

Z zarządzaniem sesją wiąże się od razu kilka typów ataków. Atakujący albo kradnie, albo podsuwa użytkownikowi swoje ID sesji i dzięki temu uzyskuje dostęp do aplikacji internetowej, nie znając hasła użytkownika. Następnie może w aplikacji robić cokolwiek, o czym użytkownik nie wie. Obrona polega na prawidłowej konfiguracji serwera i PHP.

Przy czym Nette Framework konfiguruje PHP automatycznie. Programista nie musi więc zastanawiać się, jak prawidłowo zabezpieczyć sesję i może w pełni skupić się na tworzeniu aplikacji. Wymaga to jednak włączonej funkcji ini_set().

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

Flaga SameSite może mieć trzy wartości: Lax, Strict i None (ten wymaga HTTPS). Jeśli żądanie strony pochodzi bezpośrednio ze strony internetowej lub użytkownik otwiera stronę, wpisując ją bezpośrednio w pasku adresu lub klikając zakładkę, przeglądarka wysyła do serwera wszystkie pliki cookie (czyli z flagami Lax, Strict i None). Jeśli użytkownik przejdzie na stronę przez link z innej strony, do serwera zostaną przekazane pliki cookie z flagami Lax i None. Jeśli żądanie powstanie w inny sposób, np. przez wysłanie formularza POST z innej strony, załadowanie wewnątrz iframe, za pomocą JavaScriptu itp., wysłane zostaną tylko pliki cookie z flagą None.

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

wersja: 4.0