Files
yii/docs/guide/ru/topics.security.txt
2012-03-21 02:59:17 +04:00

125 lines
7.8 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&кому=кулхацкеру`.
Если в браузере пользователя установлен cookie, позволяющий запомнить
его на сайте, посещение такой страницы вызовет перевод 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>