Pasar cadenas codificadas en base64 en URL

Resuelto Alix Axel asked hace 54 años • 12 respuestas

¿Es seguro pasar cadenas codificadas en base64 sin formato a través de parámetros GET?

Alix Axel avatar Jan 01 '70 08:01 Alix Axel
Aceptado

Hay especificaciones base64 adicionales. (Consulte la tabla aquí para obtener detalles específicos). Pero esencialmente necesitas 65 caracteres para codificar: 26 minúsculas + 26 mayúsculas + 10 dígitos = 62.

Necesita dos ['+', '/'] más y un carácter de relleno '='. Pero ninguno de ellos es compatible con URL, así que simplemente use caracteres diferentes para ellos y listo. Los estándar del cuadro anterior son ['-', '_'], pero puedes usar otros caracteres siempre que los decodifiques de la misma manera y no necesites compartirlos con otros.

Recomiendo simplemente escribir a sus propios ayudantes. Como estos de los comentarios en la página del manual de php para base64_encode :

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

function base64_url_decode($input) {
 return base64_decode(strtr($input, '-_.', '+/='));
}
Joe Flynn avatar Apr 29 '2011 17:04 Joe Flynn

No, necesitaría codificarlo mediante URL, ya que las cadenas base64 pueden contener los caracteres "+", "=" y "/" que podrían alterar el significado de sus datos; parece una subcarpeta.

Los caracteres base64 válidos se encuentran a continuación.

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
Thiyagaraj avatar Sep 03 '2009 17:09 Thiyagaraj

@joeshmo O en lugar de escribir una función auxiliar, puede simplemente codificar mediante URL la cadena codificada en base64. Esto haría exactamente lo mismo que la función auxiliar, pero sin la necesidad de dos funciones adicionales.

$str = 'Some String';

$encoded = urlencode( base64_encode( $str ) );
$decoded = base64_decode( urldecode( $encoded ) );
rodrigo-silveira avatar Dec 21 '2011 18:12 rodrigo-silveira

Nota introductoria Me inclino a publicar algunas aclaraciones ya que algunas de las respuestas aquí fueron un poco engañosas (si no incorrectas).

La respuesta es NO , no puede simplemente pasar un parámetro codificado en base64 dentro de una cadena de consulta URL ya que los signos más se convierten en un ESPACIO dentro de la matriz global $_GET. En otras palabras, si envió test.php?myVar=stringwith+sign a

//test.php
print $_GET['myVar'];

el resultado sería:
stringwith sign

La manera fácil de resolver esto es simplemente urlencode()su cadena base64 antes de agregarla a la cadena de consulta para escapar de los caracteres +, = y / a los códigos %##. Por ejemplo, urlencode("stringwith+sign")devolucionesstringwith%2Bsign

Cuando procesa la acción, PHP se encarga de decodificar la cadena de consulta automáticamente cuando completa el $_GET global. Por ejemplo, si envié test.php?myVar=stringwith%2Bsign a

//test.php
print $_GET['myVar'];

el resultado sería:
stringwith+sign

No desea la urldecode()cadena $_GET devuelta ya que los + se convertirán en espacios.
En otras palabras, si envié el mismo test.php?myVar=stringwith%2Bsign a

//test.php
$string = urldecode($_GET['myVar']);
print $string;

el resultado es inesperado:
stringwith sign

Sería seguro para rawurldecode()la entrada, sin embargo, sería redundante y, por tanto, innecesario.

Jeffory J. Beckers avatar Sep 25 '2012 22:09 Jeffory J. Beckers

Si y no.

En algunos casos, el juego de caracteres básico de base64 puede entrar en conflicto con las convenciones tradicionales utilizadas en las URL. Pero muchas de las implementaciones de base64 le permiten cambiar el juego de caracteres para que coincida mejor con las URL o incluso venir con uno (como el de Python urlsafe_b64encode()).

Otro problema al que puede enfrentarse es el límite de longitud de la URL o, mejor dicho, la falta de dicho límite. Debido a que los estándares no especifican una longitud máxima, los navegadores, servidores, bibliotecas y otro software que trabaje con el protocolo HTTP pueden definir sus propios límites.

Michał Górny avatar Sep 03 '2009 17:09 Michał Górny