Захист від вразливостей

Час від часу повідомляється про безпекову діру на черговому великому веб-сайті або про її використання. Це неприємно. Якщо вам важлива безпека ваших веб-додатків, Nette Framework, безумовно, є найкращим вибором.

Cross-Site Scripting (XSS)

Cross-Site Scripting – це метод порушення веб-сайтів, що використовує необроблені вихідні дані. Зловмисник може вставити свій власний код на сторінку, тим самим змінивши її або навіть отримавши конфіденційні дані відвідувачів. Захиститися від XSS можна лише послідовною та коректною обробкою всіх рядків. При цьому достатньо, щоб ваш кодер лише один раз забув про це, і весь веб-сайт може бути миттєво скомпрометований.

Прикладом атаки може бути підстановка зміненої URL користувачу, за допомогою якої ми впроваджуємо свій код на сторінку. Якщо додаток не буде належним чином обробляти вихідні дані, він виконає скрипт у браузері користувача. Таким чином, ми можемо, наприклад, викрасти його ідентичність.

https://example.com/?search=<script>alert('Успішна XSS атака.');</script>

Nette Framework пропонує революційну технологію Context-Aware Escaping, яка назавжди позбавить вас ризику Cross-Site Scriptingu. Вона автоматично обробляє всі вихідні дані, тому кодер не може щось забути. Приклад? Кодер створює цей шаблон:

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

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

Запис {$message} означає виведення змінної. В інших фреймворках необхідно явно обробляти кожне виведення, і навіть у кожному місці по-різному. У Nette Framework не потрібно нічого обробляти, все робиться автоматично, правильно та послідовно. Якщо ми присвоїмо змінній $message = 'Ширина 1/2"', фреймворк згенерує HTML-код:

<p onclick="alert(&quot;Ширина 1\/2\&quot;&quot;)">Ширина 1/2&quot;</p>

<script>
document.title = "Ширина 1\/2\"";
</script>

Cross-Site Request Forgery (CSRF)

Атака Cross-Site Request Forgery полягає в тому, що зловмисник заманює жертву на сторінку, яка непомітно виконує запит у браузері жертви до сервера, на якому жертва авторизована, і сервер вважає, що запит був виконаний жертвою за власним бажанням. Таким чином, під ідентичністю жертви виконується певна дія, про яку вона не знає. Це може бути зміна або видалення даних, надсилання повідомлення тощо.

Nette Framework автоматично захищає форми та сигнали в presenter'ах від цього типу атак. Це робиться шляхом запобігання їх надсиланню або виклику з іншого домену. Якщо ви хочете вимкнути захист, використовуйте для форм:

$form->allowCrossOrigin();

або у випадку сигналу додайте анотацію @crossOrigin:

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

У Nette Application 3.2 ви також можете використовувати атрибути:

use Nette\Application\Attributes\Requires;

#[Requires(sameOrigin: false)]
public function handleXyz()
{
}

URL attack, керуючі символи, недійсний UTF-8

Різні терміни, пов'язані зі спробою зловмисника підсунути вашому веб-додатку шкідливі вхідні дані. Наслідки можуть бути дуже різноманітними, від пошкодження XML-виводів (наприклад, непрацюючі RSS-канали) до отримання конфіденційної інформації з бази даних або паролів. Захистом є послідовна обробка всіх вхідних даних на рівні окремих байтів. І, чесно кажучи, хто з вас це робить?

Nette Framework робить це за вас, і до того ж автоматично. Вам не потрібно нічого налаштовувати, і всі вхідні дані будуть оброблені.

Session hijacking, session stealing, session fixation

З керуванням сесіями пов'язано кілька типів атак. Зловмисник або викрадає, або підсовує користувачеві свій ідентифікатор сесії, і завдяки цьому отримує доступ до веб-додатку, не знаючи пароля користувача. Потім він може робити в додатку будь-що, не знаючи про це користувача. Захист полягає в правильній конфігурації сервера та PHP.

При цьому Nette Framework налаштовує PHP автоматично. Програміст таким чином не повинен думати, як правильно захистити сесію, і може повністю зосередитися на створенні додатку. Однак це вимагає увімкненої функції ini_set().

SameSite cookies надають механізм для розпізнавання того, що призвело до завантаження сторінки. Що є абсолютно критичним для безпеки.

Прапорець SameSite може мати три значення: Lax, Strict та None (останній вимагає HTTPS). Якщо запит на сторінку надходить безпосередньо з веб-сайту, або користувач відкриває сторінку, вводячи її безпосередньо в адресний рядок або клацаючи на закладку, браузер надсилає серверу всі файли cookie (тобто з прапорцями Lax, Strict та None). Якщо користувач переходить на веб-сайт за посиланням з іншого веб-сайту, серверу передаються файли cookie з прапорцями Lax та None. Якщо запит виникає іншим чином, наприклад, надсиланням POST-форми з іншого веб-сайту, завантаженням усередині iframe, за допомогою JavaScript тощо, надсилаються лише файли cookie з прапорцем None.

Nette за замовчуванням надсилає всі файли cookie з прапорцем Lax.

версія: 4.0