Захист від уразливостей
Час від часу оголошується про серйозні недоліки в системі безпеки або навіть зловживання. Звичайно, це трохи неприємно. Якщо ви дбаєте про безпеку своїх веб-додатків, фреймворк 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
.