Возникла проблема с 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(); ?>
Открываем 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=="
Расскажите, люди добрые, в чём подвох, я не правильно понял механику процесса, или что то надо донастраивать? В чём тогда заключается защита, если токен выходит не одноразовый?