¿Es seguro pasar cadenas codificadas en base64 sin procesar a través de parámetros GET?
¿Es seguro pasar cadenas codificadas en base64 sin procesar a través de parámetros GET?
Respuestas:
No, necesitaría codificarlo en url, ya que las cadenas de base64 pueden contener los caracteres "+", "=" y "/" que podrían alterar el significado de sus datos. Parezca una subcarpeta.
La base válida de 64 caracteres está debajo.
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
Hay especificaciones adicionales de base64. (Vea la tabla aquí para detalles). Pero esencialmente necesita 65 caracteres para codificar: 26 minúsculas + 26 mayúsculas + 10 dígitos = 62.
Necesita dos más ['+', '/'] y un relleno de caracteres '='. Pero ninguno de ellos es compatible con URL, así que solo usa caracteres diferentes para ellos y listo. Los estándares del cuadro anterior son ['-', '_'], pero puede usar otros caracteres siempre que los decodifique de la misma manera, y no necesite compartirlos con otros.
Recomiendo simplemente escribir 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, '._-', '+/='));
}
urlencode
como lo sugiere la respuesta de rodrigo-silveira. Crear dos nuevas funciones para guardar pocos caracteres en la longitud de la URL, es como entrar en su casa pasando por la ventana en lugar de simplemente usar la puerta.
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
,
debería ser urlencoded %2C
, sugiero usar en ._-
lugar de -_,
como la única variante en en.wikipedia.org/wiki/Base64#Variants_summary_table que mantiene el final =
@joeshmo O en lugar de escribir una función auxiliar, puede simplemente urlencode 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 ) );
/
carácter si lo pasa no como un parámetro GET, sino como una ruta en la URL. Cambiará tu camino si no lo reemplazas /
con algo más en ambos lados.
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")
devuelvestringwith%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 a
//test.php
print $_GET['myVar'];
el resultado sería:
stringwith+sign
Usted no quiere a urldecode()
la cadena devuelta $ _GET como s + '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 lo tanto, innecesario.
<br>
, por lo que no es necesario escribir mucho HTML. Espero que esto ayude, edité su respuesta un poco para mejorarla aún más.
Si y no.
El juego de caracteres básico de base64 puede en algunos casos colisionar con las convenciones tradicionales utilizadas en las URL. Pero muchas de las implementaciones de base64 le permiten cambiar el conjunto de caracteres para que coincida mejor con las URL o incluso vienen con una (como Python urlsafe_b64encode()
).
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 otro software que trabaja con el protocolo HTTP pueden definir sus propios límites. Puedes echar un vistazo a este artículo: Preguntas frecuentes sobre WWW: ¿Cuál es la longitud máxima de una URL?
Es una codificación base64url que puedes probar, es solo una extensión del código de joeshmo anterior.
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));
}
En teoría, sí, siempre y cuando no exceda la longitud máxima de cadena de consulta y / o url para el cliente o servidor.
En la práctica, las cosas pueden ponerse 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 "==".
Para la codificación segura de URL, como base64.urlsafe_b64encode(...)
en Python, el siguiente código me funciona al 100%
function base64UrlSafeEncode(string $input)
{
return str_replace(['+', '/'], ['-', '_'], base64_encode($input));
}
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, da como resultado una cadena decodificada incorrecta. /
es seguro en un par de parámetros get. =
siempre está al final de la cadena codificada en base64 y el lado del servidor puede resolver =
directamente.