Защита от уязвимостей
Время от времени объявляется о серьезных недостатках в системе безопасности или даже злоупотреблениях. Конечно, это немного неприятно. Если вы заботитесь о безопасности своих веб-приложений, фреймворк 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("Width 1\/2\"")">Width 1/2"</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 обеспечивают механизм распознавания того, что привело к загрузке страницы. Что абсолютно необходимо по соображениям безопасности.
Флаг SameSite может иметь три значения: Lax
, Strict
и None
(требуется HTTPS). Если запрос на страницу поступает непосредственно с
самого сайта или пользователь открывает страницу, непосредственно
введя её в адресную строку или нажав на закладку, браузер отправляет
все куки на сервер (т. е. с флагами Lax
, Strict
и None
). Если
пользователь попадает на сайт по ссылке с другого сайта, на сервер
передаются файлы куки с флагами Lax
и None
. Если запрос
возникает в другом месте, например, отправка POST-формы из другого
источника, загрузка внутри iframe, использование JavaScript и т. д., будут
отправлены только куки с флагом None
.
По умолчанию Nette отправляет все куки с флагом Lax
.