Проверка CSRF в Yii2 без файлов cookie - PullRequest
0 голосов
/ 07 апреля 2020

В моем приложении Yii2 есть форма, которую пользователи отправляют. На сайте включена проверка CSRF, но если у пользователя отключены файлы cookie, возникает ошибка. Каков наилучший способ справиться с такой ситуацией? Я действительно не хочу отключать проверку CSRF, чтобы убедиться, что форма отправляется только с моего сайта. Там нет никакого процесса входа в систему. Это просто одноразовая ситуация для пользователя. Спасибо.

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Еще одна вещь, которую вы можете попробовать, - это проверить, включены ли у пользователя файлы cookie или нет? Теперь это ваше предпочтение, хотите ли вы проверить это при запуске вашего сайта или когда пользователь заполнит форму.

Как я видел на многих сайтах, они просят нас разрешить использование файлов cookie. Вы можете проверить следующую ссылку, чтобы проверить, включен ли повар ie. https://www.dummies.com/programming/php/check-whether-php-cookies-are-enabled/

Если вы более JavaScript человек, вы также можете проверить следующую ссылку.

Проверьте, включены ли файлы cookie

Я бы посоветовал вам показать предупреждение при открытии страницы формы, что куки не включены.

Спасибо! Надеюсь, это поможет.

0 голосов
/ 08 апреля 2020

Вы можете заставить свое приложение хранить токен CSRF в сеансе вместо cook ie, установив для свойства enableCsrfCookie компонента yii\web\Request значение false. Вы можете сделать это в своей сети. php config:

$config = [
    // ...
    'components' => [
        'request' => [
            'enableCsrfCookie' => false,
        ],
        // ...
    ],
    // ...
];

Но это заставит приложение запускать сеанс для каждого запроса. Также сеансы по умолчанию используют файлы cookie для хранения идентификатора сеанса, поэтому, в конце концов, это может не сильно улучшить, если вы хотите избежать использования файлов cookie.

Вы также можете расширить yii\web\Request и переопределить его методы generateCsrfToken() и loadCsrfToken() использовать другое хранилище для токена. Но помните, что по умолчанию нет способа узнать, какие запросы поступили из одного сеанса. Необходимо сохранить какой-то идентификатор sessionId в клиенте, а затем отправить его обратно на сервер, чтобы можно было связать запрос, отправляющий форму, с токеном CSRF и запросом, сгенерировавшим токен CSRF.

Другая возможность отключить стандартную защиту CSRF и реализовать собственную защиту формы. Например, вы можете сохранить некоторый секретный ключ в настройках приложения. Затем при создании формы вы будете использовать метод yii\base\Security::hashData() для добавления временной метки к вашей форме:

$timestamp = Yii::$app->security->hashData(time(), $yourSecurityKey);
Html::hiddenInput('my-csrf', $timestamp);

Затем вы можете проверить ее в действии вашего контроллера:

$timestamp = Yii::$app->security->validateData(
   Yii::$app->request->post('my-csrf'),
   $yourSecurityKey
);

if ($timestamp === false || $timestamp < (time() - $timeLimitInSeconds)) {
     //Do something when CSRF validation is not valid (for example throw bad request exception)
}

// continue form processing

Предупреждение: защита в примере не так безопасна, как стандартная защита CSRF, потому что кто-то может запросить форму из вашего приложения для получения сгенерированного токена, чем использовать токен от него в течение ограниченного времени в форме, отправленной с их сайта.

...