Безопасность
Класс Security содержит методы, которые помогают защитить ваш сайт от атак Cross-Site Request Forgery.
Загрузка библиотеки
Если вас интересует только загрузка библиотеки для обработки защиты от CSRF, то вам никогда не придется её загружать вручную, так как она работает как фильтр и не требует ручного взаимодействия.
Если же вам потребуется прямой доступ, то вы можете загрузить её через файл Services:
$security = \Config\Services::security();
Межсайтовая подделка запроса (CSRF)
Предупреждение
Защита от CSRF доступна только для запросов POST/PUT/PATCH/DELETE. Запросы других методов не защищены.
Методы защиты от CSRF
По умолчанию используется защита от CSRF на основе куки. Она соответствует методу Double Submit Cookie из OWASP Cross-Site Request Forgery Prevention Cheat Sheet.
Также можно использовать защиту от CSRF на основе сессии. Она соответствует методу Synchronizer Token Pattern.
Вы можете установить использование защиты от CSRF на основе сессии, изменив значение параметра конфигурации в файле app/Config/Security.php:
public $csrfProtection = 'session';
Включить защиту от CSRF
Вы можете включить защиту от CSRF, изменив файл app/Config/Filters.php и включив фильтр csrf глобально:
public $globals = [
'before' => [
// 'honeypot',
'csrf',
],
];
Некоторые URI могут быть исключены из защиты от CSRF (например, API-эндпоинты, ожидающие внешние POST-запросы). Вы можете добавить эти URI, добавив их в качестве исключений в фильтр:
public $globals = [
'before' => [
'csrf' => ['except' => ['api/record/save']],
],
];
Поддерживаются также регулярные выражения (регистронезависимые):
public $globals = [
'before' => [
'csrf' => ['except' => ['api/record/[0-9]+']],
],
];
Также можно включить фильтр CSRF только для определённых методов:
public $methods = [
'get' => ['csrf'],
'post' => ['csrf'],
];
HTML-формы
Если вы используете помощник для форм, то form_open() автоматически вставит скрытое поле csrf в ваши формы.
Примечание
Чтобы использовать автоматическое создание поля CSRF, необходимо включить фильтр CSRF на странице формы. В большинстве случаев это делается с помощью метода GET.
Если нет, то вы можете использовать всегда доступные функции csrf_token() и csrf_hash().
<input type="hidden" name="<?= csrf_token() ?>" value="<?= csrf_hash() ?>" />
Кроме того, вы можете использовать метод csrf_field() для генерации этого скрытого поля ввода:
// Generates: <input type="hidden" name="{csrf_token}" value="{csrf_hash}" />
<?= csrf_field() ?>
При отправке запроса JSON токен CSRF также может быть передан в качестве одного из параметров. Ещё один способ передачи токена CSRF – специальный HTTP-заголовок, имя которого доступно через функцию csrf_header().
Кроме того, вы можете использовать метод csrf_meta() для создания удобного мета-тега:
// Generates: <meta name="{csrf_header}" content="{csrf_hash}" />
<?= csrf_meta() ?>
Порядок отправки токенов пользователями
Порядок проверки наличия токена CSRF:
-
$_POSTмассив - HTTP-заголовок
-
php://input(запрос JSON) – имейте в виду, что этот подход является самым медленным, так как нам нужно декодировать JSON, а затем закодировать его заново
Перегенерация токенов
Токены могут перегенерироваться при каждой отправке (по умолчанию) или оставаться неизменными в течение всего срока действия куки CSRF. Перегенерация токенов по умолчанию обеспечивает более строгую безопасность, но может привести к проблемам с удобством использования, поскольку другие токены становятся недействительными (обратная навигация, несколько вкладок/окон, асинхронные действия и т. д.). Вы можете изменить это поведение, изменив значение параметра конфигурации в файле app/Config/Security.php:
public $regenerate = true;
Перенаправление при ошибке
Когда запрос не проходит проверку CSRF, по умолчанию происходит перенаправление на предыдущую страницу, устанавливая сообщение error flash-сообщение, которое вы можете отобразить пользователю. Это обеспечивает более удобный опыт, чем просто ошибка. Это можно отключить, изменив значение параметра конфигурации в файле app/Config/Security.php:
public $redirect = false;
Даже когда значение перенаправления true, AJAX-запросы не будут перенаправлены, а выбросят ошибку.
Другие полезные методы
Вам вряд ли понадобится использовать большинство методов класса Security напрямую. Ниже приведены методы, которые могут оказаться полезными и не связаны с защитой от CSRF.
sanitizeFilename()
Пытается очистить имена файлов, чтобы предотвратить попытки обхода каталога и другие угрозы безопасности, что особенно полезно для файлов, предоставленных пользователем. Первый параметр – путь для очистки.
Если для входных данных пользователя допустимы относительные пути, например, file/in/some/approved/folder.txt, вы можете установить второй необязательный параметр, $relativePath, в значение true.
$path = $security->sanitizeFilename($request->getVar('filepath'));
© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/user_guide/libraries/security.html