Несоответствие токена CSRF после перенаправления 3DS с формы оформления заказа

Вопрос или проблема

Я обрабатываю транзакцию с помощью обычной формы HTML в Laravel. Всё работает хорошо, пока транзакция не должна пройти проверку 3ds. Когда я отправляю информацию о транзакции, я предоставляю ссылку для перенаправления, куда клиенту нужно перейти после завершения проверки 3ds. Проблема в том, что я получаю следующую ошибку на странице, на которую произошло перенаправление. Если я обновляю страницу, она загружается нормально.

" throw new TokenMismatchException('Несоответствие CSRF токена.');"

введите описание изображения здесь

Я не уверен, почему он ищет токен на странице, на которой приземляется, так как это пустая страница, и я ещё ничего на ней не написал.

Я нашёл работающее решение, но оно включает в себя отключение CSRF для этого конкретного URL/страницы. Не уверен, безопасно ли это.

$middleware->validateCsrfTokens(except: [
            'mypagename/',
        ]);

Ответ или решение

Проблема, с которой вы столкнулись, связана с механизмом защиты от межсайтовой подделки запросов (CSRF) в Laravel. Когда пользователь переходит на страницу после завершения 3DS верификации, Laravel ожидает получить CSRF токен в запросе. Если этот токен не передан или не совпадает с ожидаемым, вы получите исключение TokenMismatchException, как в вашем случае.

Вот несколько способов решения этой проблемы:

  1. Использование сессии для хранения состояния: После перенаправления на страницу 3DS, вы можете сохранить состояние (например, с помощью сессий), чтобы затем восстановить его на странице, куда пользователь будет перенаправлен после 3DS верификации. Это позволит избежать проблем с CSRF.

  2. Передача CSRF токена в URL: Хотя это менее безопасный вариант, вы можете задуматься о передаче CSRF токена через URL или скрытое поле в форме. В этом случае, после обработки 3DS, Laravel сможет использовать токен для валидации во время обработки запроса.

  3. Использование AJAX или JavaScript: Если возможно, вы можете использовать AJAX-запрос для его отправки после завершения 3DS верификации. Это позволит вам контролировать, какие данные отправляются, и может помочь избежать проблемы с CSRF токеном.

  4. Исключение URL из проверки CSRF: Как вы уже упомянули, можно отключить проверку CSRF для конкретного URL, используя следующий код:

    $middleware->validateCsrfTokens(except: [
       'mypagename/',
    ]);

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

  5. Настройка редиректа: Убедитесь, что при редиректе после 3DS, вы корректно передаете нужные параметры, в том числе токен. В некоторых случаях может помочь использование HTTP-заголовков или других методов передачи данных.

Важно помнить о безопасности. Лучший способ устранить проблему — понять, почему токен не передается должным образом, а не просто отключать проверку. Регулярно проверяйте свою систему безопасности и обновляйте зависимости. Если вы не уверены в безопасности вашего решения, всегда лучше проконсультироваться с опытным разработчиком или экспертом в области безопасности веб-приложений.

Оцените материал
Добавить комментарий

Капча загружается...