В PHP из коробки поддерживается только обычная Base64‑кодировка с помощью встроенных функций base64_encode
и base64_decode
. Но стандартный формат не подходит для URL, так как символы + / =
могут быть некорректно интерпретированы браузером или сервером.
Отличия Base64URL от обычного Base64
- Символы: вместо
+
и/
в Base64URL используются-
и_
. Это сделано, чтобы строка была безопасна для использования в интернете (в адресах сайтов, например). - Знаки равенства
=
: в обычном Base64 они иногда появляются в конце для «выравнивания». В Base64URL их обычно убирают.
Из‑за этих небольших отличий, стандартный base64_decode
в PHP не понимает Base64URL. Он ждёт «свои» символы и нужную длину.
Реализация Base64URL в PHP
Так как PHP не имеет встроенных функций для Base64URL, нужно написать собственные:
<?php
function base64UrlEncode(string $data): string {
// Кодируем данные в стандартный Base64
$base64 = base64_encode($data);
// Подменяем символы + и /
$base64Url = strtr($base64, '+/', '-_');
// Убираем символы выравнивания "="
return rtrim($base64Url, '=');
}
function base64UrlDecode(string $base64Url): string {
// Подменяем обратно символы - и _
$base64 = strtr($base64Url, '-_', '+/');
// Добавляем выравнивающие "=" при необходимости
$padding = strlen($base64) % 4;
if ($padding) {
$base64 .= str_repeat('=', 4 - $padding);
}
// Декодируем в обычную строку
return base64_decode($base64);
}
// Пример использования
$text = '<<<?!?!?>>>';
$encoded = base64UrlEncode($text);
echo "Закодированная строка: $encoded".PHP_EOL;
$decoded = base64UrlDecode($encoded);
echo "Декодированная строка: $decoded".PHP_EOL;
Где используется Base64URL?
- JWT (JSON Web Tokens) – токены авторизации состоят из трех частей (header, payload, signature), каждая из которых кодируется именно в Base64URL.
- OAuth 2.0 – некоторые протоколы передачи ключей и кодов используют безопасное кодирование.
- URL‑параметры – когда нужно передать двоичные данные (например, бинарный ID или хэш) прямо в строке запроса.
- API – безопасная передача данных между сервисами.
Base64URL — это всего лишь «безопасная для URL» версия Base64. Встроенных функций в PHP нет, зато две небольшие функции решают задачу полностью.