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.
Sé que es una respuesta simple, pero estoy enviando a través de GET por una razón determinada. – user
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
ah whoops Veo que esta respuesta ha sido editada. Oh, bueno, es correcto ahora. +1 – thomasrutter