Безпека

1. Запобігання міжсайтового скриптинга

Міжсайтовий скриптинг (також відомий як XSS) — зловмисний збір інформації користувача,через сторінки веб-додатку. Частіше за все, виконуючий атаку, використовує вразливості додатку, включає в текст сторінки JavaScript, VBScript, ActiveX, HTML або Flash. Робиться це для отримання інформації інших користувачів додатку та подальшого використання її в не хороших цілях. Для прикладу, погано написаний форум може відображати повідомлення без якої-небудь перевірки. Атакуючий може вставити JavaScript-код у повідомлення. Всі, хто прочитають це повідомлення, виконають код на своєму компютері.

Щоб не допустити XSS-атаки потрібно завжди перевіряти те, що ввів користувач, перед тим як це відображати. Звичайно, щоб не допустити вводу скриптів, можна кодувати всі HTML-сутності. В деяких ситуаціях, така поведінка не бажана, так як ввід HTML стає недоступним.

Yii включає в себе бібліотеку HTMLPurifier і надає розробнику корисний інструмент CHtmlPurifier, котрий може фільтрувати весь шкідливий код за допомогою ретельно перевіреного білого листа. Також компонент робить код сумісний із стандартами.

CHtmlPurifier може бути використаний і як віджет, і як фільтр. При використанні в якості віджета CHtmlPurifier обробляє вкладений в нього вміст:

<?php $this->beginWidget('CHtmlPurifier'); ?>
…цей текст буде підданий делікатній санобробці…
<?php $this->endWidget(); ?>

2. Запобігання підробці міжсайтових запитів

Підробка міжсайтового запиту (CSRF) — атака, при якій сайт атакуючого змушує браузер користувача виконати яку-небудь дію на іншому сайті. Для прикладу, на сайті атакуючого є сторінка, яка містить тег img з атрибутом src, який вказує на сайт банку http://bank.example/переказ?сума=10000&кому=кулхацкеру. Якщо в браузері користувача встановлені cookies, які дозволяються запамʼятати його на сайті, відвідування цієї сторінки викличе переказ 10000 тугриків нехорошому кулхацкеру. В CSRF на відміну від міжсайтового скриптингу, основаному на довірі користувача до сайту, використовується довіра сайту, до деякого користувача.

Для того щоб не допустити CSRF, слід дотримуватися простого правила. GET — тільки для отримання даних. Нічого змінювати при GET запитах не можна. Для POST необхідно використовувати випадкове значення, яке можна перевірити на сервері і переконатися, що запит іде звідти, звідки потрібно.

В Yii реалізований захист від CSRF-атаки, яка відбувається через POST. Захист грунтується на зберіганні випадкового значення в cookie і порівняння його із значенням POST.

За замовчуванням, захист від CSRF відключений. Для його включення потрібно налаштувати компонент CHttpRequest у файлі конфігурації:

return array(
    'components'=>array(
        'request'=>array(
            'enableCsrfValidation'=>true,
        ),
    ),
);

Для відображення форми потрібно використовувати CHtml::form замість написання HTML-тега. Даний метод дозволяє автоматично включити випадкове значення, яке використовується для перевірки на CSRF, як приховане поле форми.

3. Запобігання атаки через cookie

Захист cookie дуже важлива, так як в них найчастіше зберігається ID сесії. Якщо зловмисник отримає ID сесії він отримає і всю інформацію, котра зберігається в ній.

Є декілька способів запобігти атаці через cookie:

  • Використовувати SSL для створення захисного зʼєднання і передавати cookie тільки через нього. Атакуючий не зможе розшифрувати вміст cookie, які передаються;

  • Вчасно оголошувати сесію застарілою, включаючи всі cookie і маркери сесії, для того, щоб зменшити вірогідність можливої атаки;

  • Запобігти XSS, тим самим унеможливити захоплення cookie;

  • Перевіряти данні з cookie і перевіряти чи змінені вони.

В Yii реалізована перевірки на зміни, через підрахунок хешу HMAC від значення cookie.

За замовчуванням перевірка cookie відключена. Для її включення необхідно у конфігурації додатку, налаштувати компонент CHttpRequest наступним чином.

return array(
    'components'=>array(
        'request'=>array(
            'enableCookieValidation'=>true,
        ),
    ),
);

При використанні перевірки cookie, звертатися до них необхідно через колекцію cookies, а не напряму через $_COOKIES:

// Отримуємо cookie із заданим імям
$cookie=Yii::app()->request->cookies[$name];
$value=$cookie->value;
…
// Відсилаємно cookie
$cookie=new CHttpCookie($name,$value);
Yii::app()->request->cookies[$name]=$cookie;

Be the first person to leave a comment

Please to leave your comment.