Base64URL zmienia dwa znaki alfabetu: standardowy plus Base64 staje się myślnikiem, a ukośnik staje się podkreśleniem. Zakodowana informacja pozostaje niezmieniona. Wariant ten pomaga, gdy otaczający protokół nadaje specjalne znaczenie plusowi lub ukośnikowi, ale nie zwalnia wartości z każdej reguły URL lub aplikacji.
Użyj wektora, który uwydatnia różnicę
Bajty FB FF kodują jako +/8= w standardzie Base64 i -_8= w Base64URL. Test taki jak Hello generuje tylko wspólne znaki alfabetu, więc nie może wykazać, czy działa bezpieczna konwersja URL.
const standard = btoa(String.fromCharCode(251, 255));
const urlSafe = standard.replace(/\+/g, '-').replace(/\//g, '_');
console.log(standard); // +/8=
console.log(urlSafe); // -_8=
Wypełnienie stanowi osobna umowa
Wiele formatów tokenów pomija końcowe znaki równości, a inne systemy je zachowują. Zmiana alfabetu i usunięcie dopełnienia to niezależne decyzje. Jeśli długość wejścia bez dopełnienia przy dzieleniu przez 4 daje resztę 2, trzeba dodać dwa znaki równości; przy reszcie 3 wystarczy jeden. Reszty 1 nie da się naprawić samym dodaniem dopełnienia, ponieważ jeden sześciobitowy znak nie wystarcza do przedstawienia pełnego bajtu.
Podczas sprawdzania poprawności sprawdź także nieużywane bity w ostatnim znaku. Dekoder, który je ignoruje, może zaakceptować kilka ciągów znaków dla tej samej sekwencji bajtów. Ta niejednoznaczność może mieć znaczenie, gdy aplikacja porównuje zakodowane ciągi zamiast zdekodowanych bajtów. Producent kanoniczny powinien wyemitować jedną uzgodnioną reprezentację.
Nie myl analizowania zapytań z dekodowaniem Base64
Analiza zapytań w stylu formularza interpretuje dosłowny plus jako spację. Dlatego standardowa wartość Base64 wklejona do zapytania bez zmiany znaczenia może zostać uszkodzona, zanim dekoder ją zobaczy. Skonstruuj zapytanie za pomocą URLSearchParamslub użyj wariantu Base64URL, jeśli określa to protokół odbiorczy.
const query = new URLSearchParams({ payload: '+/8=' });
console.log(query.toString()); // payload=%2B%2F8%3D
console.log(query.get('payload')); // +/8=
Nie zastępuj automatycznie każdej spacji znakiem plus: spacja może być prawdziwym formatowaniem lub dowodem innego błędu. Zachowaj źródło, zidentyfikuj warstwę transportową, która je zmieniła, i zastosuj celową korektę. W przypadku segmentów JWT użyj reguł formatu tokenu Base64URL zamiast wymyślać ogólne zasady napraw.
Alfabety standardowe i URL bezpieczne opisano w RFC 4648. Twoja integracja nadal wymaga wyraźnych wyborów dotyczących dopełnienia, akceptowania białych znaków i maksymalnej długości.