2009-09-11 8 views
6

Al buscar la codificación URL segura base 64, he encontrado que es una cosa muy no estándar. A pesar de la gran cantidad de funciones integradas que tiene PHP, no hay una para la codificación URL segura base 64. En la página del manual para base64_encode(), la mayoría de los comentarios que sugieren el uso de esa función, envuelto con strtr():¿Qué reemplazos de caracteres se deben realizar para que la URL de codificación de base 64 sea segura?

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

El único módulo de Perl que pude encontrar en esta área es MIME::Base64::URLSafe (source), que lleva a cabo las sustituciones siguientes internamente:

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

diferencia de la función PHP anteriormente, esta versión Perl gotas el carácter '=' (igual) por completo, en lugar de reemplazarla con '' (coma) como lo hace PHP. Equals es un carácter de relleno, por lo que el módulo Perl los reemplaza según sea necesario en la decodificación, pero esta diferencia hace que las dos implementaciones sean incompatibles.

Por último, la función de Python urlsafe_b64encode(s) mantiene el relleno '=' alrededor, lo que llevó a alguien que aguantar this function para eliminar el relleno que muestra un lugar destacado en los resultados de Google para '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)) 

El deseo aquí es tener una cadena que se puede incluir en una URL sin codificación adicional, de ahí el abandono o la traducción de los caracteres '+', '/' y '='. Como no hay un estándar definido, ¿cuál es la forma correcta?

Respuesta

9

sí parece ser un estándar, es RFC 3548, Sección 4, Base 64 Codificación con el URL y nombre de archivo de seguridad del alfabeto:

Esta codificación es técnicamente idéntico a la anterior, a excepción de la 62: nd y 63: carácter del alfabeto rd, como indican en la tabla 2.

+ y / debe reemplazar d por - (minus) y _ (understrike) respectivamente. Cualquier bibliotecas incompatibles deben ser envueltos por lo que cumplen la norma RFC 3548.

Tenga en cuenta que esto requiere que el URL codificar los caracteres (pad) =, pero yo prefiero que más del URL codificar los + y / caracteres del alfabeto base64 estándar.

0

¿Por qué no tratas de envolverlo en un urlencode()? Documentación here.

+1

Utiliza una cantidad innecesaria de caracteres. ¿Por qué no solo urlencode la cadena binaria en primer lugar? – recursive

2

Sugeriría que se ejecute la salida de base64_encode a través de urlencode. Por ejemplo:

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

Si preguntas acerca de la forma correcta, me gustaría ir con adecuada codificación URL en oposición a la sustitución arbitraria de caracteres. Primero base64-codifique sus datos, luego codifique caracteres especiales como "=" con la codificación URL adecuada (es decir, %<code>).

+0

No puedo usar las funciones ya disponibles, pero usar urlencode() puede agregar mucha longitud extra. –

8

No creo que esté bien o mal.Pero la codificación más popular es

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

Esto es ampliamente utilizado por Google, Yahoo (lo llaman Y64). La versión más segura de url de los codificadores que utilicé en Java, Ruby admite este conjunto de caracteres.

+0

+1 por mencionar Y64 y agregar algo de cultura a la pregunta – jmserra

Cuestiones relacionadas