Какие замены должны быть выполнены, чтобы обеспечить безопасный URL-адрес базы 64?

Если посмотреть на кодировку с кодировкой URL-кода, основанной на 64-х, я обнаружил, что это очень нестандартная вещь. Несмотря на обилие встроенных функций, которые есть у PHP, для кодировки с кодировкой URL-адреса не существует. На странице руководства для base64_encode() большинство комментариев предлагает использовать эту функцию, завернутую в strtr() :

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

Единственным модулем Perl, который я смог найти в этой области, является MIME :: Base64 :: URLSafe ( источник ), который выполняет следующую замену внутри:

 sub encode ($) { my $data = encode_base64($_[0], ''); $data =~ tr|+/=|\-_|d; return $data; } 

В отличие от вышеприведенной функции PHP, эта версия Perl полностью сбрасывает символ «=» (равно), вместо того, чтобы заменять ее «,» (запятая), как это делает PHP. Equals является дополняющим символом, поэтому модуль Perl заменяет их по мере необходимости при декодировании, но это различие делает эти две реализации несовместимыми.

Наконец, функция python urlsafe_b64encode хранит пробел «=», предлагая кому-то использовать эту функцию, чтобы удалить дополнение, которое заметно отображает результаты Google для «python base64 url ​​safe» :

 from base64 import urlsafe_b64encode, urlsafe_b64decode def uri_b64encode(s): return urlsafe_b64encode(s).strip('=') def uri_b64decode(s): return urlsafe_b64decode(s + '=' * (4 - len(s) % 4)) 

Желание здесь состоит в том, чтобы иметь строку, которая может быть включена в URL без дальнейшей кодировки, следовательно, канавка или перевод символов «+», «/» и «=». Поскольку нет определенного стандарта, каков правильный путь?

Кажется, что существует стандарт, это RFC 3548 , Раздел 4, Base 64 Кодирование с URL и имя файла Безопасный алфавит :

Эта кодировка технически идентична предыдущей, за исключением символов 62: n и 63: rd, как указано в таблице 2.

+ и / должны быть заменены на - (minus) и _ (understrike) соответственно. Любые несовместимые библиотеки должны быть обернуты, чтобы они соответствовали RFC 3548.

Обратите внимание, что для этого требуется, чтобы URL-адрес закодировал символы (pad) = , но я предпочитаю, чтобы над URL-кодированием символов + и / из стандартного алфавита base64.

Я не думаю, что это правильно или неправильно. Но наиболее популярная кодировка

 '+/=' => '-_.' 

Это широко используется Google, Yahoo (они называют его Y64). Самая надежная версия кодировщиков, которые я использовал на Java, Ruby поддерживает этот набор символов.

Я бы предложил запустить вывод base64_encode через urlencode. Например:

 function base64_encode_url( $str ) { return urlencode( base64_encode( $str ) ); } 

Если вы спрашиваете о правильном пути, я бы пошел с правильной кодировкой URL, а не с произвольной заменой символов. Сначала base64-кодирует ваши данные, а затем кодирует специальные символы, такие как «=» с правильной кодировкой URL (т.е. %<code> ).

Почему бы вам не попробовать обернуть его в urlencode() ? Документация здесь.