Класс безопасности
Класс безопасности содержит методы, которые помогут создать безопасное приложение, обрабатывающее входные данные для безопасности.
XSS Фильтрация
CodeIgniter поставляется с фильтрацией предотвращения межсайтовых сценариев (Cross Site Scripting), для часто используемых методов запуска JavaScript или других типов кода, которые пытаются захватить куки(cookies) или сделать другие вредоносные вещи. Если встречается что-то запрещенное, оно становится безопасной при конвертации данных в символьные сущности.
Чтобы фильтровать данные путем XSS используйте xss_clean() метод:
$data = $this->security->xss_clean($data);
Необязательный второй параметр, is_image, позволяет этой функции использование тестирования изображений на потенциальные XSS атаки, полезно для безопасности при загрузке файлов. Когда второй параметр установлен в TRUE, вместо того, чтобы вернуть измененную строку, функция возвращает TRUE если изображение является безопасным и FALSE если в нем содержатся потенциально опасные сведения, которые браузер может попытаться выполнить.
if ($this->security->xss_clean($file, TRUE) === FALSE)
{
// файл не прошел XSS тест
}
Подделки межсайтовых запросов (CSRF)
Можно включить CSRF защиту путем изменения своего application/config/config.php файла следующим образом:
$config['csrf_protection'] = TRUE;
Если вы используете хелпер форм, тогда form_open() автоматически вставит скрытое csrf поле в форме. Если нет, то можно использовать get_csrf_token_name() и get_csrf_hash()
$csrf = array(
'name' => $this->security->get_csrf_token_name(),
'hash' => $this->security->get_csrf_hash()
);
...
<input type="hidden" name="<?=$csrf['name'];?>" value="<?=$csrf['hash'];?>" />
Токены могут быть созданы при каждой передаче (по умолчанию) или же сохранятся в течение всей жизни CSRF куки. Создание токенов по умолчанию предусматривает усиление безопасности, что может сказаться на юзабилити, так как другие токены становятся недействительными (назад/вперед в навигации, вкладки/окна, асинхронные действия). Вы можете изменить это поведение путем изменения следующих параметров конфигурации
$config['csrf_regenerate'] = TRUE;
URI могут быть внесены в белый список от csrf защиты (например, конечные точки API ожидая удаленного размещенния контента). Вы можете добавить эти URI путем редактирования конфигурации ‘csrf_exclude_uris’ параметра:
$config['csrf_exclude_uris'] = array('api/person/add');
Регулярные выражения также поддерживаются (без учета регистра):
$config['csrf_exclude_uris'] = array(
'api/record/[0-9]+',
'api/title/[a-z]+'
);
Справка класса
- class CI_Security
- xss_clean($str[, $is_image = FALSE])
Параметры: - $str (смешанный) – Введенная строка или массив строк
Возвращает: XSS-очищенные данные
Возвращаемый тип: смешанный
Пытается удалить XSS уязвимости из входных данных и возвращает очищенный строку. Если второй необязательный параметр имеет значение true, то вернет булево TRUE если изображение является безопасным для использования и FALSE если вредоносный код был обнаружен.
- sanitize_filename($str[, $relative_path = FALSE])
Параметры: - $str (строка) – Путь/имя файла
- $relative_path (булево) – Стоит ли сохранять все каталоги в пути к файлу
Возвращает: Облагороженное путь/имя файла
Возвращаемый тип: строка
Пытается санировать имена файлов в целях предотвращения попыток обхода каталога и других угроз безопасности, что особенно полезно для файлов, которые были получены от пользователя.
$filename = $this->security->sanitize_filename($this->input->post('filename'));
Это приемлемо для ввода относительного пути пользователем, например file/in/some/approved/folder.txt, вы можете установить второй опциональный параметр, $relative_path в TRUE.
$filename = $this->security->sanitize_filename($this->input->post('filename'), TRUE);
- get_csrf_token_name()
Возвращает: CSRF имя токена Возвращаемый тип: строка Возвращает CSRF имя токена ($config['csrf_token_name'] значение).
- get_csrf_hash()
Возвращает: CSRF хеш Возвращаемый тип: строка Возвращает CSRF хеш значение. Полезно в сочетании сget_csrf_token_name() для построения форм вручную или отправке AJAX POST запросов.
- entity_decode($str[, $charset = NULL])
Параметры: - $str (строка) – Входная строка
- $charset (строка) – Набор символов входной строки
Возвращает: Декодированная строка
Возвращаемый тип: строка
Этот метод действует очень похоже на родную PHP html_entity_decode() функцию в ENT_COMPAT режиме, только он пытается определить HTML-объекты, которые не заканчиваются точкой с запятой.
Если $charset параметр пуст, тогда ваша конфигурация $config['charset'] будет использована.
- get_random_bytes($length)
Параметры: - $length (число) – Длина выходных данных
Возвращает: Двоичный поток случайных байт или false в случае неудачи
Возвращаемый тип: строка
Метод для получения соответствующих случайных байт через mcrypt_create_iv(), /dev/urandom или openssl_random_pseudo_bytes() (в таком порядке), если один из них доступен.
Используется для создания CSRF и XSS токенов.
Примечание
Вывод НЕ гаранитирует быть криптографически стойкой, просто хорошая попытка.