mirror of
https://github.com/yiisoft/yii.git
synced 2026-03-12 11:06:54 +01:00
91 lines
7.6 KiB
Plaintext
91 lines
7.6 KiB
Plaintext
Безпека
|
||
=======
|
||
|
||
Запобігання міжсайтового скриптинга
|
||
-----------------------------------
|
||
|
||
Міжсайтовий скриптинг (також відомий як 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>
|