Nette Documentation Preview

syntax
Защита от уязвимост
*******************

.[perex]
От време на време се съобщава за сериозни пропуски в сигурността или дори за злоупотреби. Разбира се, това е малко неприятно. Ако ви е грижа за сигурността на вашите уеб приложения, рамката Nette определено е най-добрият избор за вас.


Пресичане на сайтове (Cross-Site Scripting - XSS) .[#toc-cross-site-scripting-xss]
==================================================================================

Cross-site scripting е метод за нарушаване на работата на уебсайт чрез използване на непроверени входни данни. Атакуващият може да инжектира свой собствен HTML или JavaScript код и да промени външния вид на страницата или дори да събере чувствителна потребителска информация. Защитата срещу XSS е проста: последователно и правилно проверявайте всички редове и входни данни. Традиционно беше достатъчно програмистът да допусне и най-малката грешка, да забрави веднъж, и целият сайт можеше да бъде компрометиран.

Пример за такова инжектиране е предаването на модифициран URL адрес на потребител, който вмъква "злонамерен" скрипт във файл. Ако дадено приложение не защити правилно своя вход, такава заявка може да доведе до изпълнение на скрипт от страна на клиента. Това може да доведе например до кражба на самоличност.

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

Рамката на Nette предлага чисто нова технология за [избягване, |latte:safety-first#Context-Aware-Escaping] която завинаги ще премахне рисковете от скриптове на различни сайтове. Той автоматично ескапира всички входни данни въз основа на зададения контекст, така че програмистът да не може случайно да забрави нещо. Разгледайте следния шаблон като пример:

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

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

Командата `{$message}` извежда променлива. Други рамки често принуждават разработчиците изрично да декларират escape и дори типа на escape в зависимост от контекста. С Nette обаче не е необходимо да декларирате нищо. Всичко се случва автоматично, последователно и прецизно. Ако зададем променлива на `$message = 'Width 1/2"'`, рамката ще генерира този HTML код:

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

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


Фалшифициране на заявка от друг сайт (CSRF) .[#toc-cross-site-request-forgery-csrf]
===================================================================================

Атаката Cross-Site Request Forgery се състои в това, че нападателят примамва жертвата да посети страница, която безшумно изпълнява заявка в браузъра на жертвата към сървъра, в който жертвата е влязла в момента, и сървърът приема, че заявката е направена от жертвата по нейна собствена воля. Сървърът извършва определено действие под самоличността на жертвата, но без нейното знание. Това може да бъде промяна или изтриване на данни, изпращане на съобщение и т.н.

Nette **автоматично защитава формулярите и сигналите в презентаторите** от този тип атаки. Това става, като се предотвратява изпращането или извикването им от друг домейн. За да деактивирате защитата, използвайте следното за формите

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

или, в случай на сигнал, добавете анотацията `@crossOrigin`:

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

В PHP 8 можете да използвате и атрибути:

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

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


URL атака, контролни кодове, невалиден UTF-8 .[#toc-url-attack-control-codes-invalid-utf-8]
===========================================================================================

Различни термини, свързани с опита на нападателя да направи приложението ви "злонамерено". Резултатите могат да варират в широки граници - от непълен XML изход (напр. нарушен RSS канал) до получаване на чувствителна информация от база данни и извличане на пароли на потребители. Защитата срещу тези атаки е последователна проверка на UTF-8 на ниво байт. И честно казано, не бихте го направили без рамка, нали?

Рамката на Nette прави това автоматично за вас. Не е необходимо да конфигурирате каквото и да било и приложението ви ще бъде защитено.


Отвличане на сесии, кражба на сесии, заключване на сесии .[#toc-session-hijacking-session-stealing-session-fixation]
====================================================================================================================

Управлението на сесиите включва няколко вида атаки. Атакуващият може да открадне или да подмени идентификатора на сесията на жертвата и по този начин да получи достъп до уеб приложение без действителна парола. След това нападателят може да направи всичко, което потребителят може да направи, без никакви следи. Защитата се състои в правилното конфигуриране на PHP и на самия уеб сървър.

Nette конфигурира PHP автоматично. По този начин разработчиците не трябва да се притесняват за това дали сесията е достатъчно сигурна и могат да се съсредоточат изцяло върху ключовите части на приложението. За целта е необходимо да активирате функцията `ini_set()`.


Бисквитки на SameSite .[#toc-samesite-cookie]
=============================================

Бисквитките SameSite предоставят механизъм за разпознаване на причината за зареждането на дадена страница. Това е абсолютно необходимо от съображения за сигурност.

Флагът SameSite може да има три стойности: `Lax`, `Strict` и `None` (изисква се HTTPS). Ако заявката за страницата идва директно от самия сайт или ако потребителят влезе директно в страницата, като я напише в адресната лента или като щракне върху отметки, браузърът изпраща всички бисквитки на сървъра (т.е. с флагове `Lax`, `Strict` и `None`). Ако потребителят влезе в уебсайта чрез връзка от друг уебсайт, на сървъра се изпращат "бисквитки" с флагове `Lax` и `None`. Ако заявката е направена на друго място, например при изпращане на POST формуляр от друг източник, изтегляне в iframe, използване на JavaScript и т.н., ще бъде изпратена само бисквитката с флаг `None`.

По подразбиране Nette изпраща всички бисквитки с флаг `Lax`.


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

Защита от уязвимост

От време на време се съобщава за сериозни пропуски в сигурността или дори за злоупотреби. Разбира се, това е малко неприятно. Ако ви е грижа за сигурността на вашите уеб приложения, рамката Nette определено е най-добрият избор за вас.

Пресичане на сайтове (Cross-Site Scripting – XSS)

Cross-site scripting е метод за нарушаване на работата на уебсайт чрез използване на непроверени входни данни. Атакуващият може да инжектира свой собствен HTML или JavaScript код и да промени външния вид на страницата или дори да събере чувствителна потребителска информация. Защитата срещу XSS е проста: последователно и правилно проверявайте всички редове и входни данни. Традиционно беше достатъчно програмистът да допусне и най-малката грешка, да забрави веднъж, и целият сайт можеше да бъде компрометиран.

Пример за такова инжектиране е предаването на модифициран URL адрес на потребител, който вмъква „злонамерен“ скрипт във файл. Ако дадено приложение не защити правилно своя вход, такава заявка може да доведе до изпълнение на скрипт от страна на клиента. Това може да доведе например до кражба на самоличност.

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

Рамката на Nette предлага чисто нова технология за избягване, която завинаги ще премахне рисковете от скриптове на различни сайтове. Той автоматично ескапира всички входни данни въз основа на зададения контекст, така че програмистът да не може случайно да забрави нещо. Разгледайте следния шаблон като пример:

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

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

Командата {$message} извежда променлива. Други рамки често принуждават разработчиците изрично да декларират escape и дори типа на escape в зависимост от контекста. С Nette обаче не е необходимо да декларирате нищо. Всичко се случва автоматично, последователно и прецизно. Ако зададем променлива на $message = 'Width 1/2"', рамката ще генерира този HTML код:

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

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

Фалшифициране на заявка от друг сайт (CSRF)

Атаката Cross-Site Request Forgery се състои в това, че нападателят примамва жертвата да посети страница, която безшумно изпълнява заявка в браузъра на жертвата към сървъра, в който жертвата е влязла в момента, и сървърът приема, че заявката е направена от жертвата по нейна собствена воля. Сървърът извършва определено действие под самоличността на жертвата, но без нейното знание. Това може да бъде промяна или изтриване на данни, изпращане на съобщение и т.н.

Nette автоматично защитава формулярите и сигналите в презентаторите от този тип атаки. Това става, като се предотвратява изпращането или извикването им от друг домейн. За да деактивирате защитата, използвайте следното за формите

$form->allowCrossOrigin();

или, в случай на сигнал, добавете анотацията @crossOrigin:

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

В PHP 8 можете да използвате и атрибути:

use Nette\Application\Attributes\CrossOrigin;

#[CrossOrigin]
public function handleXyz()
{
}

URL атака, контролни кодове, невалиден UTF-8

Различни термини, свързани с опита на нападателя да направи приложението ви „злонамерено“. Резултатите могат да варират в широки граници – от непълен XML изход (напр. нарушен RSS канал) до получаване на чувствителна информация от база данни и извличане на пароли на потребители. Защитата срещу тези атаки е последователна проверка на UTF-8 на ниво байт. И честно казано, не бихте го направили без рамка, нали?

Рамката на Nette прави това автоматично за вас. Не е необходимо да конфигурирате каквото и да било и приложението ви ще бъде защитено.

Отвличане на сесии, кражба на сесии, заключване на сесии

Управлението на сесиите включва няколко вида атаки. Атакуващият може да открадне или да подмени идентификатора на сесията на жертвата и по този начин да получи достъп до уеб приложение без действителна парола. След това нападателят може да направи всичко, което потребителят може да направи, без никакви следи. Защитата се състои в правилното конфигуриране на PHP и на самия уеб сървър.

Nette конфигурира PHP автоматично. По този начин разработчиците не трябва да се притесняват за това дали сесията е достатъчно сигурна и могат да се съсредоточат изцяло върху ключовите части на приложението. За целта е необходимо да активирате функцията ini_set().

Бисквитките SameSite предоставят механизъм за разпознаване на причината за зареждането на дадена страница. Това е абсолютно необходимо от съображения за сигурност.

Флагът SameSite може да има три стойности: Lax, Strict и None (изисква се HTTPS). Ако заявката за страницата идва директно от самия сайт или ако потребителят влезе директно в страницата, като я напише в адресната лента или като щракне върху отметки, браузърът изпраща всички бисквитки на сървъра (т.е. с флагове Lax, Strict и None). Ако потребителят влезе в уебсайта чрез връзка от друг уебсайт, на сървъра се изпращат „бисквитки“ с флагове Lax и None. Ако заявката е направена на друго място, например при изпращане на POST формуляр от друг източник, изтегляне в iframe, използване на JavaScript и т.н., ще бъде изпратена само бисквитката с флаг None.

По подразбиране Nette изпраща всички бисквитки с флаг Lax.