online codificacion base64_decode php url string get base64

php - codificacion - Pasando cadenas codificadas en base64 en URL



php base64 decode (9)

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

La respuesta es NO , no puede simplemente pasar un parámetro codificado en base64 dentro de una cadena de consulta de 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 forma más fácil de resolver esto es simplemente urlencode() su cadena base64 antes de agregarla a la cadena de consulta para escapar de los códigos +, = y / a los códigos% ##. Por ejemplo, urlencode("stringwith+sign") devuelve stringwith%2Bsign

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

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

El resultado sería:
stringwith+sign

No desea urldecode() la cadena $ _GET devuelta como + ''s se convertirá en espacios.
En otras palabras, si envié el mismo test.php? MyVar = stringwith% 2Bsign to

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

El resultado es un inesperado:
stringwith sign

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

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


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

$str = ''Some String''; $encoded = urlencode( base64_encode( $str ) ); $decoded = base64_decode( urldecode( $encoded ) );


En teoría, sí, siempre y cuando no exceda la longitud máxima de url y / oor string de consulta para el cliente o servidor.

En la práctica, las cosas pueden ser un poco más complicadas. Por ejemplo, puede desencadenar una HttpRequestValidationException en ASP.NET si el valor contiene un "on" y se deja en el final "==".


Es una codificación base64url que puede probar, es solo la extensión del código de joeshmo que se encuentra arriba.

function base64url_encode($data) { return rtrim(strtr(base64_encode($data), ''+/'', ''-_''), ''=''); } function base64url_decode($data) { return base64_decode(str_pad(strtr($data, ''-_'', ''+/''), strlen($data) % 4, ''='', STR_PAD_RIGHT)); }


Hay especificaciones adicionales de base64. (Vea la tabla here para detalles). 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 url amigable, así que solo usa caracteres diferentes para ellos y listo. Los estándares del cuadro de arriba son [''-'', ''_''], pero puede usar otros caracteres siempre que los decodifique de la misma manera y no necesite compartirlos con otros.

Recomiendo simplemente escribir tus propios ayudantes. Como estos de los comentarios en la página de 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, ''._-'', ''+/='')); }


No creo que esto sea seguro porque, por ejemplo, el carácter "=" se usa en base cruda 64 y también se usa para diferenciar los parámetros de los valores en un GET de HTTP.


No, tendría que codificarlo con url, ya que las cadenas base64 pueden contener los caracteres "+", "=" y "/" que podrían alterar el significado de sus datos, parecerse a una subcarpeta.

Los caracteres base64 válidos están abajo.

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=


Sí, siempre es seguro. por supuesto, base64 contiene: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= pero una cadena codificada en base64 generalmente no tiene + . + se convertirá en un espacio en blanco, lo que resultará en una cadena decodificada incorrectamente. / es seguro en un par de obtener parámetros. = siempre está al final de la cadena codificada en base64 y el lado del servidor puede resolver = directamente.


Si y no.

El conjunto de caracteres básico de base64 puede, en algunos casos, chocar con las convenciones tradicionales utilizadas en las URL. Pero muchas de las implementaciones de base64 te permiten cambiar el conjunto de caracteres para que coincida mejor con las URL o incluso vienen con una (como urlsafe_b64encode() Python).

Otro problema que puede enfrentar es el límite de la longitud de la URL o, más bien, la falta de dicho límite. Debido a que los estándares no especifican ninguna longitud máxima, los navegadores, servidores, bibliotecas y otros programas que trabajan con el protocolo HTTP pueden definir sus propios límites. Puede consultar este artículo: Preguntas frecuentes sobre WWW: ¿Cuál es la longitud máxima de una URL?