CSRF проверка

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
lexbond
Сообщения: 11
Зарегистрирован: 2021.04.09, 17:17

CSRF проверка

Сообщение lexbond »

Доброго вечера!
Возникла проблема с CSRF защитой на Yii1, решил проверить на Yii2 тоже. Насколько я понял, CSRF токен нужен для проверки подлинности запроса, защиты от межсайтингового скриптинга. Он должен быть уникальным каждый раз когда отправляется форма.
Я решил проверить это на чистом установленном фреймворке следующим образом:
- По умолчанию такая проверка включена в конфигах
- Создаем простую формочку

Код: Выделить всё

class JustForm extends Model
{
    public $text;

    public function rules()
    {
        return [
            [['text'], 'required'],
            [['text'], 'string']
        ];
    }
}
- Создаем экшн простого принятия данных

Код: Выделить всё

$model = new JustForm();

        if($model->load(Yii::$app->request->post()) && $model->validate()) {
            echo "Hi, there!<br>";
            echo $model->text;
            return ;
        }

        return $this->render('fake', [
            'model'=>$model
        ]);
- Создаем вьюху с формой

Код: Выделить всё

<?php $form = ActiveForm::begin(); ?>
<?= /** @var \app\models\JustForm $model */
$form->field($model, 'text')->textInput(['autofocus' => true]) ?>

<?= Html::submitButton('Отправить', ['class' => 'btn btn-primary', 'name' => 'login-button']) ?>

<?php ActiveForm::end(); ?>
Пробуем через веб, всё срабатывает. Смотрим в код, токен csrf есть и он меняется при каждой загрузке страницы. Окей, идём дальше.
Открываем API клиент, вносим адрес странички, вбиваем заголовки куки, вносим параметры, отправляем - запрос не проходит, вставляем значение csrf поля сюда же, отправляем, всё проходит. Так и должно быть. Потом отправляем другие данные поля "text" и они проходят тоже по этому же токену. Окей, создаем другую страницу с другой формой, отправляем на неё данные с тем же токеном, всё принимается.
Я полагал что как только запрос с токеном выполнен, токен протухает и больше не принимается. но нет, запросы проходят.
Заливаю проект на сервер, начинаю дёргать его курлом:

Код: Выделить всё

curl -X POST -v --cookie "Cookie=tmr_lvid=b6008f34345db2ff3b9c3a18761------; PHPSESSID=" https://service.ru/site/fake-form -F "JustForm[text]='qqqqqqqqqqqqqqqqqqqqqq'" -F "_csrf=foKLIxpFTz1n76-r6Nl-5lH4tdTvSJYE_C84---tQ=="
и всё успешно проходит) Могу скринкаст записать)

Расскажите, люди добрые, в чём подвох, я не правильно понял механику процесса, или что то надо донастраивать? В чём тогда заключается защита, если токен выходит не одноразовый?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: CSRF проверка

Сообщение samdark »

Да, сейчас токен регенерится только по логину.
lexbond
Сообщения: 11
Зарегистрирован: 2021.04.09, 17:17

Re: CSRF проверка

Сообщение lexbond »

samdark писал(а): 2021.09.14, 09:37 Да, сейчас токен регенерится только по логину.
выходит этого достаточно для защиты?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: CSRF проверка

Сообщение samdark »

Смотря от чего.
Ответить