#php #security #codeigniter #token
#php #Безопасность #codeigniter #токен
Вопрос:
Недавно я узнал об атаках CSRF и был рад узнать, что защита CSRF была добавлена в Codeigniter версии 2.0.0.
Я включил эту функцию и увидел, что скрытый ввод с токеном добавлен в формы, и я предполагаю, что он также сохраняет токен в сеансе. При запросах POST CI автоматически сравнивает токены или мне нужно это делать вручную?
Ответ №1:
Токен CSRF добавляется в форму в качестве скрытого ввода только при использовании form_open()
функции.
Cookie со значением токена CSRF создается классом безопасности и при необходимости восстанавливается для каждого запроса.
Если $_POST
данные существуют, файл cookie автоматически проверяется классом ввода. Если размещенный токен не соответствует значению cookie, CI выдаст сообщение об ошибке и не сможет обработать $_POST
данные.
В принципе, все происходит автоматически — все, что вам нужно сделать, это включить это в вашей $config['csrf_protection']
и использовать form_open()
функцию для вашей формы.
Я нашел хорошую статью, которая очень хорошо это объясняет:https://beheist.com/blog/csrf-protection-in-codeigniter-2-0-a-closer-look.html
Комментарии:
1. Спасибо за разъяснение! Я так рад, что выбрал CI в качестве своего фреймворка 🙂
2. Спасибо, но ссылка мертва
3. Идеальный и полезный ответ. Сэкономил много времени благодаря правильному направлению. Спасибо, сэр!
4. @WesleyMurch Мне было интересно, имеете ли вы в виду файл cookie, который сохраняется на стороне клиента. Не мог бы пользователь преобразовать их в файлы cookie, чтобы они работали в их пользу?
Ответ №2:
Обратитесь по этой ссылке — Использовались токены CSRF с помощью помощника формы или вручную
В статье объясняется, как обходиться с токенами CSRF в
- форма открывается с помощью функции form helper
form_open()
- в формах ajax
- формы сериализации ajax / jquery
В этой статье также объясняется, как «Отключить CSRF для cetain URL (которые используются в качестве URL веб-сервисов)«
Ответ №3:
Когда включена защита csrf, класс безопасности автоматически проверяет этот токен (сравнивает токен POST с токеном COOKIE)
Ответ №4:
Для codeigniter4 вы можете включить защиту CSRF, изменив свой app/Config/Filters.php
и включив фильтр csrf глобально:
public $globals = [
'before' => [
//'honeypot'
'csrf'
]
];
Измените название здесь app/Config/App.php
/*
|--------------------------------------------------------------------------
| Cross Site Request Forgery
|--------------------------------------------------------------------------
| Enables a CSRF cookie token to be set. When set to TRUE, token will be
| checked on a submitted form. If you are accepting user data, it is strongly
| recommended CSRF protection be enabled.
|
| CSRFTokenName = The token name
| CSRFHeaderName = The header name
| CSRFCookieName = The cookie name
| CSRFExpire = The number in seconds the token should expire.
| CSRFRegenerate = Regenerate token on every submission
| CSRFRedirect = Redirect to previous page with error on failure
*/
//public $CSRFTokenName = 'csrf_test_name';
public $CSRFTokenName = 'form_csrf';
public $CSRFHeaderName = 'X-CSRF-TOKEN';
public $CSRFCookieName = 'csrf_cookie_name';
public $CSRFExpire = 7200;
public $CSRFRegenerate = true;
public $CSRFRedirect = true;
Если вы используете помощник формы, то form_open()
автоматически вставит скрытое поле csrf в ваши формы. Если нет, то вы можете использовать всегда доступные функции csrf_token()
и csrf_hash()
helper('form');//::::Load form helper
echo form_open('/u/sign-up', ['csrf_id' => 'my-id']);
вернет:
<form action="http://example.com/index.php/u/sign-up" method="post" accept-charset="utf-8">
<input type="hidden" id="my-id" name="form_csrf" value="964ede6e0ae8a680f7b8eab69136717d" />