Странные символы кодировки URL в конце токенов CSRF Laravel Sanctum

Я пытаюсь узнать, как использовать аутентификацию Laravel Sanctum. Когда я отправлюGET https://localhost/sanctum/csrf-cookie Я получаю следующие файлы cookie CSRF:

XSRF-TOKEN=eyJpdiI6Inhvb0FDVXdHZDU5QzBqQTNKaWNxTUE9PSIsInZhbHVlIjoiSXNudjNiNE9xbmtNVWdsQ0l2SDRyYUNPQXIrTGJLb2ZMVDc2NWttenZGY0NkcDRvQzFVQlZOMDRlNFdTOHJaNiIsIm1hYyI6ImY0Y2M2YzZiZWIxYWVmZTRmMWI5NWRhNTBhN2JmM2VjNGExYjU0MGYwYWVmYTE4ODQxM2I0YTFlMWVjZTVhMDkifQ%3D%3D; 

Вы можете заметить странный%3D%3D в конце токена. Эти символы также добавлены в мой файл cookie laravel_session. Когда я затем отправляю запрос с этим точным токеном в заголовке X-XSRF-TOKEN, я получаю ошибку несоответствия токена. Когда убираю символы - все работает. Интересно, откуда взялись эти персонажи и как их удалить.

UPD: поскольку это были закодированные символы URL-адреса, когда я их декодировал и поставил вместо X-XSRF-TOKEN '==', похоже, это сработало. Тем не менее, странно, почему это работало раньше, когда я просто вручную удалял символы из запроса.

2 ответа

Как ты уже знаешь, = становится %3D когда он закодирован по URL.

Обычно, когда вы встречаете строку с множеством цифр и символов в случайном порядке, которая заканчивается на == есть очень большая вероятность, что он закодирован в base64.

=добавляется (в конце строки) в качестве заполнения, чтобы соответствовать определенному количеству символов в строке. Вы можете прочитать об этом больше в этом ответе.

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

С участием ==:

{"iv":"xooACUwGd59C0jA3JicqMA==","value":"Isnv3b4OqnkMUglCIvH4raCOAr+LbKofLT765kmzvFcCdp4oC1UBVN04e4WS8rZ6","mac":"f4cc6c6beb1aefe4f1b95da50a7bf3ec4a1b540f0aefa188413b4a1e1ece5a09"}

Без ==:

{"iv":"xooACUwGd59C0jA3JicqMA==","value":"Isnv3b4OqnkMUglCIvH4raCOAr+LbKofLT765kmzvFcCdp4oC1UBVN04e4WS8rZ6","mac":"f4cc6c6beb1aefe4f1b95da50a7bf3ec4a1b540f0aefa188413b4a1e1ece5a09"}

Они такие же.

Это работает, потому что они (=) являются просто заполнением и НЕ содержат никакой информации.

Я не эксперт по laravel, но я предполагаю, почему он не работает с %3D потому что он не декодирует URL-адрес.

Да, это означает =символ, который является частью вашего CSRF-токена base64. Я предполагаю, что это работает только тогда, когда вы его удалите, потому что=символ - это специальный символ заполнения. На очень высоком уровне они просто набивают струну до нужной длины.

Другие вопросы по тегам