Странные символы кодировки 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. Я предполагаю, что это работает только тогда, когда вы его удалите, потому что=
символ - это специальный символ заполнения. На очень высоком уровне они просто набивают струну до нужной длины.