Передача строк в кодировке base64 в URL

безопасно ли передавать необработанные строки с кодировкой base64 через параметры GET?

9 ответов


нет, вам нужно будет url-кодировать его, так как строки base64 могут содержать символы"+", " = "и"/", которые могут изменить значение ваших данных, выглядят как подпапка.

допустимые символы base64 приведены ниже.

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=

есть дополнительные спецификации base64. (См. таблицу здесь для конкретики ). Но по существу вам нужно 65 символов для кодирования: 26 строчных + 26 прописных + 10 цифр = 62.

вам нужно еще два [ ' + ' ,'/'] и заполняющий символ'='. Но ни один из них не является дружественным к url, поэтому просто используйте для них разные символы и все готово. Стандартные из приведенной выше диаграммы:['-', '_'], но вы можете использовать другие символы, если вы расшифровали их так же, и не нужно было делиться с другими.

Я бы рекомендовал просто написать своих собственных помощников. Как эти из комментариев страница руководства php для base64_encode:

function base64_url_encode($input) {
 return strtr(base64_encode($input), '+/=', '._-');
}

function base64_url_decode($input) {
 return base64_decode(strtr($input, '._-', '+/='));
}

@joeshmo или вместо написания вспомогательной функции вы можете просто urlencode строку, закодированную в base64. Это будет делать то же самое, что и ваша вспомогательная функция, но без необходимости двух дополнительных функций.

$str = 'Some String';

$encoded = urlencode( base64_encode( $str ) );
$decoded = base64_decode( urldecode( $encoded ) );

Примечание я склонен опубликовать несколько разъяснений, так как некоторые из ответов здесь были немного вводящими в заблуждение (если не неправильными).

ответ-нет, вы не можете просто передать параметр в кодировке base64 в строке запроса URL, так как знаки плюса преобразуются в пространство внутри глобального массива $_GET. Другими словами, если вы послали


да и нет.

базовая кодировка base64 может в некоторых случаях сталкиваться с традиционными соглашениями, используемыми в URL-адресах. Но многие из реализаций base64 позволяют вам изменить кодировку, чтобы лучше соответствовать URL-адресам или даже прийти с одним (например, Python urlsafe_b64encode()).

еще одна проблема, с которой вы можете столкнуться, - это ограничение длины URL или, скорее, отсутствие такого ограничения. Поскольку стандарты не определяют максимальную длину, браузеры, серверы, библиотеки и другое программное обеспечение работа с протоколом HTTP может определять свои собственные ограничения. Вы можете взглянуть на эту статью: www Часто задаваемые вопросы: какова максимальная длина URL-адреса?


его код base64url вы можете попробовать, его просто расширение кода joeshmo выше.

function base64url_encode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

function base64url_decode($data) {
return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
}

Я не думаю, что это безопасно, потому что, например, символ "=" используется в raw base 64, а также используется для дифференцирования параметров от значений в HTTP GET.


теоретически, да, если вы не превышаете максимальную длину строки запроса url и / oor для клиента или сервера.

на практике все может стать немного сложнее. Например, он может вызвать HttpRequestValidationException на ASP.NET если значение содержит "on", и вы оставляете в трейлинге"==".


Да, это всегда безопасно. конечно, base64 содержит: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= но кодированная строка base64 обычно не имеет +. +будет преобразован в пустое пространство, приводит к неправильной декодированной строке. / безопасно в паре параметров get. = всегда находится в конце закодированной строки base64, и серверная сторона может разрешить = напрямую.