Wynikiem większości procedur szyfrowania (lub haszowania itp.) są dowolne dane binarne, których nie można bezpiecznie umieścić w adresie URL bez zakodowania go.
Jako jajka
, po prostu używając urlencode()
na danych powinno wystarczyć. Jednak standardowe kodowanie adresów URL może nie być najbardziej kompaktowym sposobem kodowania losowych danych binarnych. Base64
kodowanie byłoby bardziej wydajne, ale niestety nie jest całkowicie bezpieczne dla adresów URL ze względu na użycie +
znak.
Na szczęście istnieje znormalizowany, bezpieczny dla adresów URL wariant kodowania base64, określony w RFC 4648 jako „base64url”. Oto para funkcji do kodowania i dekodowania danych przy użyciu tego kodowania w PHP, na podstawie tej odpowiedzi udzielonej przez „gutzmer at usa dot net” :
function base64url_encode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}
function base64url_decode($data) {
return base64_decode(strtr($data, '-_', '+/'));
}
(Uprościłem nieco funkcję dekodowania, ponieważ przynajmniej obecne wersje PHP najwyraźniej nie wymagają =
dopełnienie znaków w wejściu do base64_decode()
.)
Ps. Aby w pierwszej kolejności bezpiecznie wygenerować losowe tokeny, zobacz m.in. to pytanie .