Какие замены символов следует выполнить, чтобы сделать URL-кодировку base 64 безопасной?
Вопрос
Анализируя безопасную кодировку 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 ()
? Документация здесь.