Nette Documentation Preview

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

.[perex]
Время от времени объявляется о серьезных недостатках в системе безопасности или даже злоупотреблениях. Конечно, это немного неприятно. Если вы заботитесь о безопасности своих веб-приложений, фреймворк Nette — это, безусловно, лучший выбор для вас.


Межсайтовый скриптинг (XSS) .[#toc-cross-site-scripting-xss]
============================================================

Межсайтовый скриптинг — это метод нарушения работы сайта с использованием неэкранированного ввода. Злоумышленник может внедрить свой собственный код HTML или JavaScript и изменить внешний вид страницы или даже собрать конфиденциальную информацию о пользователях. Защита от XSS проста: последовательное и правильное экранирование всех строк и вводимых данных. Традиционно было достаточно, если ваш кодер допустил всего одну малейшую ошибку, забыл один раз, и весь сайт может оказаться под угрозой.

Примером такой инъекции может быть передача пользователю измененного URL-адреса, который вставляет «вредоносный» сценарий в файл. Если приложение не экранирует свои входные данные должным образом, такой запрос может привести к выполнению сценария на стороне клиента. Это может, например, привести к краже личных данных.

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

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

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

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

Команда `{$message}` выводит переменную. Другие фреймворки часто заставляют разработчиков явно декларировать экранирование и даже тип экранирования в зависимости от контекста. Однако в 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 — это, безусловно, лучший выбор для вас.

Межсайтовый скриптинг (XSS)

Межсайтовый скриптинг — это метод нарушения работы сайта с использованием неэкранированного ввода. Злоумышленник может внедрить свой собственный код HTML или JavaScript и изменить внешний вид страницы или даже собрать конфиденциальную информацию о пользователях. Защита от XSS проста: последовательное и правильное экранирование всех строк и вводимых данных. Традиционно было достаточно, если ваш кодер допустил всего одну малейшую ошибку, забыл один раз, и весь сайт может оказаться под угрозой.

Примером такой инъекции может быть передача пользователю измененного URL-адреса, который вставляет «вредоносный» сценарий в файл. Если приложение не экранирует свои входные данные должным образом, такой запрос может привести к выполнению сценария на стороне клиента. Это может, например, привести к краже личных данных.

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

Фреймворк Nette предлагает совершенно новую технологию Context-Aware Escaping, которая навсегда избавит вас от рисков межсайтового скриптинга. Он автоматически экранирует все вводимые данные в зависимости от заданного контекста, поэтому кодер не сможет случайно что-то забыть. В качестве примера рассмотрим следующий шаблон:

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

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

Команда {$message} выводит переменную. Другие фреймворки часто заставляют разработчиков явно декларировать экранирование и даже тип экранирования в зависимости от контекста. Однако в 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.