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

StackOverflow https://stackoverflow.com/questions/1412391

Вопрос

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

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

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

sub encode ($) {
    my $data = encode_base64(

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

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

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

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))

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

Наконец, функция Python urlsafe_b64encode (s) сохраняет '=' обыскивая, предлагая кому-нибудь установить эту функцию , чтобы удалить ее заполнение, которое заметно в результатах Google для ' Python Base64 URL-адрес безопасно ":

<*>

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

[0], ''); $data =~ tr|+/=|\-_|d; return $data; }

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

Наконец, функция Python urlsafe_b64encode (s) сохраняет '=' обыскивая, предлагая кому-нибудь установить эту функцию , чтобы удалить ее заполнение, которое заметно в результатах Google для ' Python Base64 URL-адрес безопасно ":

<*>

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

Это было полезно?

Решение

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

  

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

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

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top