O que substituições de caracteres devem ser realizados para tornar segura URL base 64 codificação?

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

Pergunta

Ao olhar para URL base segura 64 codificação, eu achei que fosse uma coisa muito fora do padrão. Apesar do número abundante de construído em funções que PHP tem, não há um para URL base segura 64 codificação. Na página manual para base64_encode() , a maioria dos comentários sugerem usar essa função, envolvido com strtr():

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

O único módulo Perl que eu poderia encontrar nesta área está MIME :: Base64 :: URLSafe ( fonte ), que realiza a seguinte substituição internamente:

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

Ao contrário da função PHP acima, esta versão Perl cai o caractere '=' (iguais) inteiramente, em vez de substituí-lo com '' (vírgula) como PHP faz. Igual é um caracter de preenchimento, então o módulo Perl substitui-los quando necessário Quando a decodificação, mas esta diferença torna a duas implementações incompatíveis.

Finalmente, a função Python urlsafe_b64encode (s) mantém o '=' padding ao redor, o que levou alguém a colocar-se esta função para remover o preenchimento que mostra de forma proeminente nos resultados do Google para ' python base64 url ??seguro ":

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

O desejo aqui é ter uma cadeia que pode ser incluído em uma URL sem mais codificação, daí o afundamento ou tradução dos caracteres '+', '/', e '='. Como não há um padrão definido, qual é o caminho certo?

Foi útil?

Solução

Não parece ser um padrão, é RFC 3548 , secção 4, base 64 Codificação com URL e nome do arquivo do alfabeto Seguro :

Esta codificação é tecnicamente idêntico ao anterior, excepto para a 62: nd e 63: caractere do alfabeto rd, como indicado na tabela 2.

+ e / deve ser substituído por - (minus) e _ (understrike) respectivamente. Quaisquer bibliotecas incompatíveis devem ser embrulhados assim que estejam em conformidade com RFC 3548.

Note que isso requer que você URL codificar os caracteres (pad) =, mas eu prefiro que mais de URL codificação de caracteres + e / do alfabeto base64 padrão.

Outras dicas

Eu não acho que é certo ou errado. Mas a maioria de codificação popular é

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

Este é amplamente utilizado por Google, Yahoo (que eles chamam Y64). A versão mais url-safe de codificadores que eu usei em Java, Ruby suporta esse conjunto de caracteres.

Eu sugiro executando a saída do base64_encode através urlencode. Por exemplo:

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

Se você está perguntando sobre a maneira correta, eu iria com adequada URL-codificação em oposição a substituição arbitrária de caracteres. Primeiro base64 codificar seus dados, então personagens ainda codificar especiais como "=" com adequada (ou seja %<code>) codificadores de URL.

Por que você não tentar envolvê-lo em uma urlencode()? Documentação aqui.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top