web-dev-qa-db-fra.com

PHP - Signe plus avec requête GET

J'ai un script PHP qui fait le cryptage de base d'une chaîne via la méthode ci-dessous:

<?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 exemple d'URL pour crypter une chaîne ressemblerait à ceci:

Encrypt.php? Method = encrypt & str = le renard rapide

Qui retournerait ceci comme la chaîne cryptée:

LCuT/ieVa6cl3/4VtzE + jd9QPT3kvHYYJFqG6tY3P0Q =

Maintenant, pour décrypter la chaîne, tout ce que vous avez à faire est de changer la requête "méthode" en "décrypter", comme ceci:

Encrypt.php? Method = decrypt & str = LCuT/ieVa6cl3/4VtzE + jd9QPT3kvHYYJFqG6tY3P0Q =

Le seul problème est que lorsque cette chaîne chiffrée est déchiffrée, elle renvoie ceci:

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

J'ai réduit le problème au signe plus qui se trouve dans la chaîne cryptée. La méthode GET de PHP semble traduire un signe plus dans un espace vide. J'ai recherché ce bogue et découvert qu'il a déjà été déposé ici . J'ai essayé différentes méthodes répertoriées sur cette page et d'autres sans succès. Le plus proche que j'ai obtenu est en utilisant ceci:

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

puis en utilisant $ fixedstring dans les méthodes de chiffrement, le problème est que lors du déchiffrement, tous les espaces vides sont convertis en signes plus. Des idées?

Je sais que l'utilisation de POST aurait plus de sens mais j'utilise GET pour des raisons spécifiques. J'épargnerai les détails.

34
user

Si vous lisez l'intégralité de ce rapport de bogue, vous verrez une référence à RFC 2396 . Ce qui indique que + est réservé . PHP est correct pour traduire un signe + non encodé en espace.

Vous pouvez utiliser urlencode () le texte chiffré lorsque vous le renvoyez à l'utilisateur. Ainsi, lorsque l'utilisateur soumet le texte chiffré pour le déchiffrement, vous pouvez l'urldecode (). PHP le fera automatiquement pour vous s'il arrive également via la chaîne GET.

Conclusion: Le + doit être soumis à PHP comme valeur codée:% 2B

43
hobodave

Je me rends compte que c'est une vieille question, mais je cherchais une solution à un problème similaire avec des signes + dans une chaîne GET. Je suis tombé sur cette page et j'ai pensé partager la solution que j'ai trouvée.

<?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;
?>
10
Andrew

Vous devez utiliser urlencode() avant de placer la chaîne chiffrée sur la chaîne de requête, ce qui "échappera" à tout caractère spécial (y compris +), Puis appellera - urldecode() avant de le décrypter, pour les ramener à leur forme d'origine.

4
Chad Birch

aucune des réponses ci-dessus n'a fonctionné pour moi, j'ai résolu le problème du signe "+" en utilisant

rawurldecode() 

et

 rawurlencode() 
2
Alex Angelico

Nous avons rencontré le même problème en essayant de passer une URL à un script PHP avec une variable de chaîne contenant le symbole "+". Nous avons pu le faire fonctionner avec;

encodeURIComponent([string])

PAR EXEMPLE:

var modelString = "SEACAT+PROFILER";
modelString = encodeURIComponent(modelString);
//"SEACAT%2BPROFILER"

Le %2B transmet la valeur correcte à PHP GET comme @hobodave l'a dit, et nous récupérons le bon ensemble de données.

J'espère que cela aide quelqu'un d'autre qui a rencontré quelque chose comme ça et avait besoin d'une interprétation légèrement différente des exemples ci-dessus.

1
delliottg