Base64 nie zapewnia tajemnicy. Każdy, kto otrzyma zakodowaną wartość, może odzyskać jej bajty bez hasła i klucza. Ukrycie danych uwierzytelniających w długim ciągu zmienia ich wygląd, a nie to, kto może je odczytać. Zastosuj te same zasady postępowania z zakodowanymi sekretami, co z oryginałami.
Kodowanie, szyfrowanie i podpisy odpowiadają na różne pytania
Kodowanie pyta, w jaki sposób bajty mogą podróżować przez system zorientowany na tekst. Szyfrowanie chroni poufność za pomocą klucza kryptograficznego. Znacznik uwierzytelniający lub podpis cyfrowy mogą potwierdzić, że dane zostały wygenerowane przez upoważnioną stronę i nie zostały zmienione, pod warunkiem, że proces weryfikacji i klucze są prawidłowe. Zwykła suma kontrolna pomaga głównie wykryć przypadkowe uszkodzenie. Żadna z tych gwarancji nie wynika wyłącznie z Base64.
Zdekodowany JWT jest użytecznym przykładem. Jego nagłówek i ładunek są strukturami czytelnymi, ale ich odczytanie nie weryfikuje podpisu, wydawcy, odbiorców ani polityki wygaśnięcia. Traktuj niezweryfikowane roszczenie jako niezaufane dane wejściowe. Nie pozwól, aby sformatowany JSON widza stał się decyzją autoryzacyjną.
Zachowaj obojętność zdekodowanej treści
Ładunek może zdekodować do HTML, JavaScript, SVG zawierającego aktywną treść lub zniekształconego dokumentu. Wyświetl tekst za pomocą textContent, nie innerHTML. Nie uruchamiaj zdekodowanego kodu ani nie wstawiaj dowolnego SVG na swoją stronę. Zadeklarowany typ Data URI MIME jest dostarczany przez nadawcę i może mieć wartość false. Podpisy plików pomagają zidentyfikować prawdopodobny format, ale pasujący nagłówek nie gwarantuje, że plik jest kompletny i bezpieczny.
// decodedText comes from an untrusted payload.
const output = document.createElement('pre');
output.textContent = decodedText;
document.body.append(output); // displays markup as text
Ustaw limity przed alokacją pamięci
Zakodowany tekst rozszerza dane, a przeglądarka może jednocześnie przechowywać ciąg wejściowy, zdekodowane bajty i podgląd. Egzekwuj limity przed dekodowaniem, ograniczaj akceptowane typy dokumentów i pozwól użytkownikom anulować długie operacje. Zniekształcone dane wejściowe powinny generować oddzielny stan błędu zamiast danych wyjściowych, które można skopiować tak, jakby były to dane pomyślne.
W przypadku wrażliwych prac sprawdź zachowanie narzędzia w sieci i zasady przechowywania. Przetwarzanie przeglądarki i przetwarzanie serwera API mają różne granice. Unikaj umieszczania tokenów w adresach URL stron, gdzie mogą wprowadzić historię przeglądarki, zrzuty ekranu lub logi dostępu. Podczas testowania używaj danych syntetycznych o tej samej strukturze. RFC 4648 omawia niejasności kodowania; bezpieczeństwo większego protokołu nadal zależy od jego kompletnego projektu.