Передача строк в кодировке 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 FAQs: какова максимальная длина 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 on ASP.NET если значение содержит "on", и вы оставляете в трейлинге"==".
Да, это всегда безопасно. конечно base64 содержит:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
но строка в кодировке base64 обычно не имеет+
.+
будет преобразован в пустое пространство, приводит к неправильной декодированной строке./
безопасно в паре параметров get.=
всегда находится в конце строки с кодировкой base64, и серверная сторона может разрешить=
напрямую.