2010-04-20 14 views
24

Tengo un script PHP que hace el cifrado básico de una cuerda por el método siguiente:PHP - signo más con la consulta GET

<?php 
$key = 'secretkey'; 
$string = $_GET['str']; 

if ($_GET['method'] == "decrypt") 
{ 
    $output = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "\0"); 
} 

if ($_GET['method'] == "encrypt") 
{ 
    $output= base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key)))); 
} 

echo $output; 
?> 

Un ejemplo de una dirección URL para cifrar una cadena se vería así:

?

Encrypt.php method = cifrar & cadena = el zorro rápida

cual se devolvía esto como la cadena cifrada:

LCUT/ieVa6cl3/4VtzE + jd9QPT3kvHY YJFqG6tY3P0Q =

Ahora para descifrar la cadena de todo lo que tiene que hacer es cambiar la consulta "método" a "descifrar", así:?

Encrypt.php method = descifrar & cadena = LCUT/ieVa6cl3/4VtzE + jd9QPT3kvHYYJFqG6tY3P0Q =

el único problema es que cuando se descifra que cadena cifrada devuelve esto:

¬ƒ§rYV} ̳5Äš · NSSI (ñïX8Þ; b

he reducido el problema a la Signo de más eso está en la cadena cifrada. El método GET de PHP parece traducir un signo más en un espacio en blanco. He buscado este error y descubrí que ya se ha archivado here. He intentado diferentes métodos enumerados en esa página y otros sin éxito. El más cercano que tengo es mediante el uso de esto:

$fixedstring = str_replace(" ", "+", $string); 

y luego usando $ fixedstring en los métodos de encriptación, el problema es, una vez descifrado, todos los espacios en blanco se convierten en signos más. ¿Algunas ideas?

Sé que usar POST tendría más sentido pero estoy usando GET por razones específicas. Ahorraré los detalles.

Respuesta

32

Si va a leer la totalidad de ese informe de errores, verá una referencia al RFC 2396. Que indica que + es reservado. PHP es correcto al traducir un signo + no codificado a un espacio.

Puede usar urlencode() el texto cifrado al devolverlo al usuario. Por lo tanto, cuando el usuario envía el texto cifrado para descifrado, puede urldecode(). PHP hará esto automáticamente por ti si también entra a través de la cadena GET.

En pocas palabras: El + debe ser sometido a PHP como el valor codificado:% 2B

+0

Sé que es una respuesta simple, pero estoy enviando a través de GET por una razón determinada. – user

+2

Esta es la respuesta correcta a su problema. Si desea utilizar un signo más literal en cualquier lugar de una URL, independientemente del idioma del lado del servidor utilizado, DEBE estar codificado, por ejemplo, reemplazándolo con "% 2B". Esto se debe a que los signos más en las URL se utilizan como un espacio para los caracteres espaciales, y los scripts del lado del servidor los interpretarán correctamente como caracteres espaciales. – thomasrutter

+0

ah whoops Veo que esta respuesta ha sido editada. Oh, bueno, es correcto ahora. +1 – thomasrutter

4

Debería utilizar urlencode() antes de poner la cadena cifrada en la cadena de consulta, que se "escape" ningún carácter especial (incluido +) y luego llame al urldecode() antes de descifrarlo, para revertirlo a su forma original.

+0

Simple; al punto. ¡Gracias! –

10

Me doy cuenta de que esta es una vieja pregunta, pero estaba buscando una solución a un problema similar con + signos en una cadena GET. Me tropiezo con esta página y pensé que compartiría la solución que se me ocurrió.

<?php 
$key = 'secretkey'; 
$string = $_GET['str']; 

if ($_GET['method'] == "decrypt") 
{ 
    $string = urlencode($string); 
    $string = str_replace("+", "%2B",$string); 
    $string = urldecode($string); 
    $output = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "\0"); 
} 

if ($_GET['method'] == "encrypt") 
{ 
    $output= base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key)))); 
} 

echo $output; 
?> 
+1

¡Gracias! Ver el código presentado me ayudó. Necesitaba conservar el carácter más en la variable de consulta para usar en un script que pasara la variable de consulta en un encabezado para una solicitud API. Simplemente codificando, reemplazando + con% 2B, y luego decodificando la variable hace justamente eso. –