Защита от уязвимостей
Время от времени объявляют, а то и используют серьёзную брешь в безопасности на очередном значимом сайте. Это неприятно. Если вам небезразлична безопасность ваших веб-приложений, Nette Framework, несомненно, лучший выбор.
Cross-Site Scripting (XSS)
Cross-Site Scripting – способ нарушения работы сайтов, использующий неэкранированный вывод. Злоумышленник может внедрить в страницу собственный код и тем самым изменить страницу или даже получить конфиденциальные данные о посетителях. Защита от XSS требует последовательного и правильного экранирования всех выводимых строк. Если ваш разработчик забудет об этом хоть раз, весь сайт может оказаться скомпрометирован.
Примером атаки может быть передача пользователю изменённого URL, который внедряет в страницу код. Если приложение вывод должным образом не экранирует, скрипт выполнится в браузере пользователя. Так можно, например, украсть его личность.
https://example.com/?search=<script>alert('Успешная XSS-атака.');</script>
Nette Framework привносит революционную технологию контекстно-зависимого экранирования, которая навсегда устраняет риск Cross-Site Scripting. Она автоматически экранирует все выводы в зависимости от контекста, так что разработчик ничего не может случайно забыть. Пример? Разработчик создаёт такой шаблон:
<p onclick="alert({$message})">{$message}</p>
<script>
document.title = {$message};
</script>
Запись {$message} означает вывод переменной. В других фреймворках
необходимо экранировать каждый вывод явно, да ещё и по-разному в каждом
месте. В Nette Framework экранировать ничего не нужно, всё делается
автоматически, правильно и последовательно. Если мы зададим
переменную $message = 'Width 1/2"', фреймворк породит такой HTML-код:
<p onclick="alert("Width 1\/2\"")">Width 1/2"</p>
<script>
document.title = "Width 1\/2\"";
</script>
Cross-Site Request Forgery (CSRF)
Атака Cross-Site Request Forgery состоит в том, что злоумышленник заманивает жертву на страницу, которая незаметно выполняет в браузере жертвы запрос к серверу, где жертва авторизована. Сервер считает, что запрос жертва сделала по своей воле. Тем самым под личностью жертвы он выполняет действие без её ведома. Это может быть изменение или удаление данных, отправка сообщения и т. п.
Nette Framework автоматически защищает формы и сигналы в презентерах от атак этого типа, не позволяя отправлять или вызывать их с другого домена. Если вы хотите защиту отключить, для форм используйте:
$form->allowCrossOrigin();
а в случае сигнала добавьте атрибут:
use Nette\Application\Attributes\Requires;
#[Requires(sameOrigin: false)]
public function handleXyz()
{
}
Эта защита опирается на заголовок Sec-Fetch-Site (Fetch Metadata), который
браузер отправляет автоматически и который нельзя подделать даже при
наличии XSS-уязвимости на сервере. Подробно это описано в статье Браузер наконец решает CSRF.
Атака через URL, управляющие коды, некорректный UTF-8
Разные обозначения попыток злоумышленника внедрить в ваше веб-приложение вредоносный ввод. Последствия могут быть самыми разными: от повреждения XML-выводов (например, неработающие RSS-ленты) до получения конфиденциальных сведений из базы данных или паролей. Защита состоит в последовательной проверке всех входных данных на уровне байтов. И, положа руку на сердце, многие ли из вас это действительно делают?
Nette Framework делает это за вас, автоматически. Ничего настраивать не нужно, и все входные данные будут очищены.
Session Hijacking, Session Stealing, Session Fixation
С работой с сессиями связано несколько видов атак. Злоумышленник либо крадёт, либо подсовывает пользователю свой session ID и тем самым получает доступ к веб-приложению, не зная пароля пользователя. Затем он может без ведома пользователя выполнять в приложении любые действия. Защита состоит в правильной настройке сервера и PHP.
Nette Framework настраивает PHP автоматически. Так что программисту не
приходится думать о том, как правильно обезопасить сессию, и он может
полностью сосредоточиться на разработке приложения. Для этого, однако,
требуется, чтобы функция ini_set() была разрешена.
SameSite cookie
Cookie SameSite дают механизм распознавания того, что привело к загрузке страницы, а это принципиально важно для безопасности.
Флаг SameSite может иметь три значения: Lax, Strict и None
(последнее требует HTTPS). Если запрос страницы приходит прямо с сайта или
пользователь открывает страницу, введя её напрямую в адресную строку
либо щёлкнув по закладке, браузер отправляет серверу все cookie (то есть с
флагами Lax, Strict и None). Если пользователь переходит
на сайт по ссылке с другого сайта, серверу передаются cookie с флагами
Lax и None. Если запрос возникает иначе, например при
отправке POST-формы с другого источника, загрузке внутри iframe, через JavaScript
и т. п., отправляются только cookie с флагом None.
Nette по умолчанию отправляет все cookie с флагом Lax.