Files
yii/docs/guide/uk/topics.security.txt

91 lines
7.6 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Безпека
=======
Запобігання міжсайтового скриптинга
-----------------------------------
Міжсайтовий скриптинг (також відомий як XSS) — зловмисний збір інформації користувача,через сторінки веб-додатку. Частіше за все, виконуючий атаку, використовує вразливості додатку, включає в текст сторінки JavaScript, VBScript, ActiveX, HTML або Flash.
Робиться це для отримання інформації інших користувачів додатку та подальшого використання її в не хороших цілях. Для прикладу, погано написаний форум може відображати повідомлення без якої-небудь перевірки. Атакуючий може вставити JavaScript-код у повідомлення. Всі, хто прочитають це повідомлення, виконають код на своєму компютері.
Щоб не допустити XSS-атаки потрібно завжди перевіряти те, що ввів користувач, перед тим як це відображати. Звичайно, щоб не допустити вводу скриптів, можна кодувати всі HTML-сутності. В деяких ситуаціях, така поведінка не бажана, так як ввід HTML стає недоступним.
Yii включає в себе бібліотеку [HTMLPurifier](http://htmlpurifier.org/) і надає розробнику корисний інструмент [CHtmlPurifier], котрий може фільтрувати весь шкідливий код за допомогою ретельно перевіреного білого листа. Також компонент робить код сумісний із стандартами.
[CHtmlPurifier] може бути використаний і як [віджет](/doc/guide/basics.view#widget), і як [фільтр](/doc/guide/basics.controller#filter). При використанні в якості віджета [CHtmlPurifier] обробляє вкладений в нього вміст:
~~~
[php]
<?php $this->beginWidget('CHtmlPurifier'); ?>
…цей текст буде підданий делікатній санобробці…
<?php $this->endWidget(); ?>
~~~
Запобігання підробці міжсайтових запитів
----------------------------------------
Підробка міжсайтового запиту (CSRF) — атака, при якій сайт атакуючого змушує браузер користувача виконати яку-небудь дію на іншому сайті. Для прикладу, на сайті атакуючого є сторінка, яка містить тег `img` з атрибутом `src`, який вказує на сайт банку `http://bank.example/переказ?сума=10000&кому=кулхацкеру`. Якщо в браузері користувача встановлені cookies, які дозволяються запамʼятати його на сайті, відвідування цієї сторінки викличе переказ 10000 тугриків нехорошому кулхацкеру. В CSRF на відміну від міжсайтового скриптингу, основаному на довірі користувача до сайту, використовується довіра сайту, до деякого користувача.
Для того щоб не допустити CSRF, слід дотримуватися простого правила. `GET` — тільки для отримання даних. Нічого змінювати при GET запитах не можна. Для `POST` необхідно використовувати випадкове значення, яке можна перевірити на сервері і переконатися, що запит іде звідти, звідки потрібно.
В Yii реалізований захист від CSRF-атаки, яка відбувається через `POST`. Захист грунтується на зберіганні випадкового значення в cookie і порівняння його із значенням `POST`.
За замовчуванням, захист від CSRF відключений. Для його включення потрібно налаштувати компонент [CHttpRequest] у
[файлі конфігурації](/doc/guide/basics.application#application-configuration):
~~~
[php]
return array(
'components'=>array(
'request'=>array(
'enableCsrfValidation'=>true,
),
),
);
~~~
Для відображення форми потрібно використовувати [CHtml::form] замість написання HTML-тега. Даний метод дозволяє автоматично включити випадкове значення, яке використовується для перевірки на CSRF, як приховане поле форми.
Запобігання атаки через cookie
------------------------------
Захист cookie дуже важлива, так як в них найчастіше зберігається ID сесії. Якщо зловмисник отримає ID сесії він отримає і всю інформацію, котра зберігається в ній.
Є декілька способів запобігти атаці через cookie:
* Використовувати SSL для створення захисного зʼєднання і передавати cookie тільки через нього. Атакуючий не зможе розшифрувати вміст cookie, які передаються;
* Вчасно оголошувати сесію застарілою, включаючи всі cookie і маркери сесії, для того, щоб зменшити вірогідність можливої атаки;
* Запобігти XSS, тим самим унеможливити захоплення cookie;
* Перевіряти данні з cookie і перевіряти чи змінені вони.
В Yii реалізована перевірки на зміни, через підрахунок хешу HMAC від значення cookie.
За замовчуванням перевірка cookie відключена. Для її включення необхідно у [конфігурації додатку](/doc/guide/basics.application#application-configuration), налаштувати компонент [CHttpRequest] наступним чином.
~~~
[php]
return array(
'components'=>array(
'request'=>array(
'enableCookieValidation'=>true,
),
),
);
~~~
При використанні перевірки cookie, звертатися до них необхідно через колекцію [cookies|CHttpRequest::cookies], а не напряму через `$_COOKIES`:
~~~
[php]
// Отримуємо cookie із заданим імям
$cookie=Yii::app()->request->cookies[$name];
$value=$cookie->value;
// Відсилаємно cookie
$cookie=new CHttpCookie($name,$value);
Yii::app()->request->cookies[$name]=$cookie;
~~~
<div class="revision">$Id: topics.security.txt 2535 2010-10-11 08:28:08Z mdomba $</div>