Nette Documentation Preview

syntax
Ochrana před zranitelnostmi
***************************

.[perex]
Co chvíli je hlášena bezpečnostní díra na dalším významném webu nebo je díry zneužito. To je nepříjemné. Pokud vám záleží na zabezpečení vašich webových aplikací, je Nette Framework zcela jistě tou nejlepší volbou.


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

Cross-Site Scripting je metoda narušení webových stránek zneužívající neošetřených výstupů. Útočník pak dokáže do stránky podstrčit svůj vlastní kód a tím může stránku pozměnit nebo dokonce získat citlivé údaje o návštěvnících. Proti XSS se lze bránit jen důsledným a korektním ošetřením všech řetězců. Přitom stačí, aby váš kodér jen jednou jedinkrát toto opomenul, a celý web může být rázem kompromitován.

Příkladem útoku může být podstrčení upravené URL uživateli, pomocí které injektujeme do stránky svůj kód. Když aplikace nebude výstupy řádně ošetřovat, vykoná skript v prohlížeči uživatele. Tímto způsobem mu můžeme například zcizit identitu.

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

Nette Framework přichází s revoluční technologií [Context-Aware Escaping |latte:safety-first#Kontextově sensitivní escapování], která vás provždy zbaví rizika Cross-Site Scriptingu. Všechny výstupy totiž ošetřuje automaticky a tak se nemůže stát, že by kodér na něco zapomněl. Příklad? Kodér vytvoří tuto šablonu:

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

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

Zápis `{$message}` znamená vypsání proměnné. V jiných frameworcích je nutné každé vypsání explicitně ošetřit a dokonce na každém místě jinak. V Nette Framework není potřeba ošetřovat nic, vše se udělá automaticky, správně a důsledně. Pokud dosadíme do proměnné `$message = 'Šířka 1/2"'`, framework vygeneruje HTML kód:

```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)
=================================

Útok Cross-Site Request Forgery spočívá v tom, že útočník naláká oběť na stránku, která nenápadně v prohlížeči oběti vykoná požadavek na server, na kterém je oběť přihlášena, a server se domnívá, že požadavek vykonala oběť o své vůli. A tak pod identitou oběti provede určitý úkon, aniž by ta o tom věděla. Může jít o změnu nebo smazání dat, odeslání zprávy atd.

Nette Framework **automaticky chrání formuláře a signály v presenterech** před tímto typem útoku. A to tím, že zabraňuje jejich odeslání či vyvolání z jiné domény. Pokud chcete ochranu vypnout, použijte u formulářů:

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

nebo v případě signálu přidejte anotaci `@crossOrigin`:

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

V Nette Application 3.2 můžete použít také atributy:

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

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


URL attack, control codes, invalid UTF-8
========================================

Různé pojmy související se snahou útočníka podstrčit vaší webové aplikaci *škodlivý* vstup. Následky mohou být velmi různorodé, od poškození XML výstupů (např. nefunkční RSS kanály) přes získání citlivých informací z databáze nebo hesel. Obranou je důsledné ošetřování všech vstupů na úrovni jednotlivých bajtů. A ruku na srdce, kdo z vás to dělá?

Nette Framework to dělá za vás a navíc automaticky. Nemusíte nastavovat vůbec nic a všechny vstupy budou ošetřené.


Session hijacking, session stealing, session fixation
=====================================================

Se správou session je spojeno hned několik typů útoků. Útočník buď zcizí anebo podstrčí uživateli své session ID a díky tomu získá přístup do webové aplikace, aniž by znal heslo uživatele. Poté může v aplikaci provádět cokoliv, aniž by o tom uživatel věděl. Obrana spočívá ve správné konfiguraci serveru a PHP.

Přičemž Nette Framework nakonfiguruje PHP automaticky. Programátor tak nemusí přemýšlet, kterak session správně zabezpečit a může se plně soustředit na tvorbu aplikace. Vyžaduje to však povolenou funkci `ini_set()`.


SameSite cookie
===============

SameSite cookies poskytují mechanismus jak rozpoznat, co vedlo k načtení stránky. Což je naprosto zásadní kvůli bezpečnosti.

Příznak SameSite může mít tři hodnoty: `Lax`, `Strict` a `None` (ten vyžaduje HTTPS). Pokud požadavek na stránku přichází přímo z webu nebo uživatel otevře stránku přímým zadáním do adresního řádku nebo kliknutím na záložku, prohlížeč pošle serveru všechny cookies (tedy s příznaky `Lax`, `Strict` i `None`). Pokud se uživatel na web proklikne přes odkaz z jiného webu, předají se serveru cookies s příznaky `Lax` a `None`. Pokud požadavek vznikne jiným způsobem, jako je odeslání POST formuláře z jiného webu, načtení uvnitř iframe, pomocí JavaScriptu, atd., odešlou se jen cookies s příznakem `None`.

Nette defaultně všechny cookie odesílá s příznakem `Lax`.

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

Ochrana před zranitelnostmi

Co chvíli je hlášena bezpečnostní díra na dalším významném webu nebo je díry zneužito. To je nepříjemné. Pokud vám záleží na zabezpečení vašich webových aplikací, je Nette Framework zcela jistě tou nejlepší volbou.

Cross-Site Scripting (XSS)

Cross-Site Scripting je metoda narušení webových stránek zneužívající neošetřených výstupů. Útočník pak dokáže do stránky podstrčit svůj vlastní kód a tím může stránku pozměnit nebo dokonce získat citlivé údaje o návštěvnících. Proti XSS se lze bránit jen důsledným a korektním ošetřením všech řetězců. Přitom stačí, aby váš kodér jen jednou jedinkrát toto opomenul, a celý web může být rázem kompromitován.

Příkladem útoku může být podstrčení upravené URL uživateli, pomocí které injektujeme do stránky svůj kód. Když aplikace nebude výstupy řádně ošetřovat, vykoná skript v prohlížeči uživatele. Tímto způsobem mu můžeme například zcizit identitu.

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

Nette Framework přichází s revoluční technologií Context-Aware Escaping, která vás provždy zbaví rizika Cross-Site Scriptingu. Všechny výstupy totiž ošetřuje automaticky a tak se nemůže stát, že by kodér na něco zapomněl. Příklad? Kodér vytvoří tuto šablonu:

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

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

Zápis {$message} znamená vypsání proměnné. V jiných frameworcích je nutné každé vypsání explicitně ošetřit a dokonce na každém místě jinak. V Nette Framework není potřeba ošetřovat nic, vše se udělá automaticky, správně a důsledně. Pokud dosadíme do proměnné $message = 'Šířka 1/2"', framework vygeneruje HTML kód:

<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)

Útok Cross-Site Request Forgery spočívá v tom, že útočník naláká oběť na stránku, která nenápadně v prohlížeči oběti vykoná požadavek na server, na kterém je oběť přihlášena, a server se domnívá, že požadavek vykonala oběť o své vůli. A tak pod identitou oběti provede určitý úkon, aniž by ta o tom věděla. Může jít o změnu nebo smazání dat, odeslání zprávy atd.

Nette Framework automaticky chrání formuláře a signály v presenterech před tímto typem útoku. A to tím, že zabraňuje jejich odeslání či vyvolání z jiné domény. Pokud chcete ochranu vypnout, použijte u formulářů:

$form->allowCrossOrigin();

nebo v případě signálu přidejte anotaci @crossOrigin:

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

V Nette Application 3.2 můžete použít také atributy:

use Nette\Application\Attributes\Requires;

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

URL attack, control codes, invalid UTF-8

Různé pojmy související se snahou útočníka podstrčit vaší webové aplikaci škodlivý vstup. Následky mohou být velmi různorodé, od poškození XML výstupů (např. nefunkční RSS kanály) přes získání citlivých informací z databáze nebo hesel. Obranou je důsledné ošetřování všech vstupů na úrovni jednotlivých bajtů. A ruku na srdce, kdo z vás to dělá?

Nette Framework to dělá za vás a navíc automaticky. Nemusíte nastavovat vůbec nic a všechny vstupy budou ošetřené.

Session hijacking, session stealing, session fixation

Se správou session je spojeno hned několik typů útoků. Útočník buď zcizí anebo podstrčí uživateli své session ID a díky tomu získá přístup do webové aplikace, aniž by znal heslo uživatele. Poté může v aplikaci provádět cokoliv, aniž by o tom uživatel věděl. Obrana spočívá ve správné konfiguraci serveru a PHP.

Přičemž Nette Framework nakonfiguruje PHP automaticky. Programátor tak nemusí přemýšlet, kterak session správně zabezpečit a může se plně soustředit na tvorbu aplikace. Vyžaduje to však povolenou funkci ini_set().

SameSite cookies poskytují mechanismus jak rozpoznat, co vedlo k načtení stránky. Což je naprosto zásadní kvůli bezpečnosti.

Příznak SameSite může mít tři hodnoty: Lax, Strict a None (ten vyžaduje HTTPS). Pokud požadavek na stránku přichází přímo z webu nebo uživatel otevře stránku přímým zadáním do adresního řádku nebo kliknutím na záložku, prohlížeč pošle serveru všechny cookies (tedy s příznaky Lax, Strict i None). Pokud se uživatel na web proklikne přes odkaz z jiného webu, předají se serveru cookies s příznaky Lax a None. Pokud požadavek vznikne jiným způsobem, jako je odeslání POST formuláře z jiného webu, načtení uvnitř iframe, pomocí JavaScriptu, atd., odešlou se jen cookies s příznakem None.

Nette defaultně všechny cookie odesílá s příznakem Lax.