Codeigniter CSRF — как это работает

#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" />