Почему в Laravel токены сессии и токены форм различаются?

Почему токены сессии и токены формы в Laravel различаются? Я добавил следующий код в файл vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php: 
```php
protected function tokensMatch($request)
{
    $token = $this->getTokenFromRequest($request);
    echo '<br>X-CSRF-TOKEN:'.$request->header('X-CSRF-TOKEN');
    echo '<br>X-XSRF-TOKEN:'.$request->header('X-XSRF-TOKEN');
    echo '<br>token:'.$request->input('_token');
    echo '<br>sessionToken:'.$request->session()->token();  

    return is_string($request->session()->token()) &&
           is_string($token) &&
           hash_equals($request->session()->token(), $token);
}
```
Несмотря на это, токены не совпадают: 
```php
echo '<br>token:'.$request->input('_token');
echo '<br>sessionToken:'.$request->session()->token();
```
Вывод: token: JWZmTQojFt8kYKUJqODi0T2XnLmshGdMnktEpjLk, sessionToken: oW08xQsg424eBT7miaLlZfsMMlfgrnXOhVJht1zy. Замечаю, что sessionToken изменяется при каждой загрузке. Как можно объяснить эту разницу?
  • 23 сентября 2024 г. 8:33
Ответы на вопрос 2
В Laravel токены сессии и токены для защиты от CSRF (Cross-Site Request Forgery) действительно различаются и выполняют разные функции.

1. **Токен сессии**: Это токен, который Laravel использует для идентификации текущей сессии пользователя. Он хранится в сессии и используется для проверки подлинности пользователя при запросах. Этот токен может изменяться при каждой загрузке, так как Laravel генерирует новый токен при создании новой сессии.

2. **CSRF-токен**: Этот токен используется для защиты от подделки запросов. Он генерируется при каждом запросе, где необходимо отправить форму, и хранится в скрытом поле формы или в заголовках AJAX-запросов. CSRF-токен включает в себя информацию о текущей сессии и должен совпадать с токеном, хранящимся в сессии, то есть при каждом формировании запроса на сервер.

Причины, по которым вы видите различия между этими токенами, можно перечислить следующим образом:

- **Разные цели**: Как упоминалось ранее, токены используются для разных целей. Токен сессии идентифицирует сессию, а CSRF токен используется для защиты форм.

- **Изменение токена сессии**: Токен сессии может меняться при изменении состояния сессии (например, при полном logout или при изменении конфигураций сессии). Токен CSRF остается фиксированным в течение времени действия формы (или до тех пор, пока не сбросится сессия).

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

### Как проверить соответствие токенов:

Чтобы корректно проверять эти токены, убедитесь, что CSRF-токен заносится в каждую форму, отправляемую на сервер, и что он совпадает с токеном сессии:

1. Проверьте, что ваше форма содержит нужный CSRF-токен. Вы можете использовать директиву Blade `@csrf` в ваших формах:

   ```html
   <form method="POST" action="/route">
       @csrf
       <!-- Остальные поля формы -->
   </form>
   ```

2. Убедитесь, что CSRF-токены корректно передаются в заголовках AJAX запросов, если вы их используете.

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