PHP - знак плюс с запросом GET - PullRequest
27 голосов
/ 20 апреля 2010

У меня есть PHP-скрипт, который выполняет базовое шифрование строки следующим способом:

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

Пример URL-адреса для шифрования строки будет выглядеть следующим образом:

Encrypt.php? Method = encrypt & str = быстрый лис

Что бы вернуть это как зашифрованную строку:

LCuT / ieVa6cl3 / 4VtzE + jd9QPT3kvHYYJFqG6tY3P0Q =

Теперь, чтобы расшифровать строку, все, что вам нужно сделать, это изменить запрос «method» на «decrypt», вот так:

Encrypt.php? Метод = дешифровать ул = LCuT / ieVa6cl3 / 4VtzE + jd9QPT3kvHYYJFqG6tY3P0Q = &

Единственная проблема в том, что когда эта зашифрованная строка расшифровывается, она возвращает следующее:

¬ƒ§rYV} ̳5Äš · НИСС (ñïX8Þ; б

Я сузил проблему до знака плюс, который находится в зашифрованной строке. Похоже, что PHP-метод GET переводит знак плюс в пустое пространство. Я искал эту ошибку и обнаружил, что она уже была зарегистрирована здесь . Я пробовал разные методы, перечисленные на этой странице и другие, но безуспешно. Самое близкое, что я получил, это:

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

и затем, используя $ fixedstring в методах шифрования, проблема заключается в том, что при расшифровке все пробелы преобразуются в знаки плюс. Есть идеи?

Я знаю, что использование POST имело бы больше смысла, но я использую GET по определенным причинам. Я сэкономлю детали.

Ответы [ 6 ]

36 голосов
/ 20 апреля 2010

Если вы прочитаете весь отчет об ошибке, вы увидите ссылку на RFC 2396 . Который заявляет, что + является зарезервированным . PHP правильно переводит некодированный знак + в пробел.

Вы можете использовать urlencode () зашифрованный текст при возврате его пользователю. Таким образом, когда пользователь отправляет зашифрованный текст для расшифровки, вы можете urldecode () его. PHP сделает это автоматически для вас, если он также поступит через строку GET.

Итог: + должен быть отправлен в PHP как закодированное значение:% 2B

10 голосов
/ 17 августа 2011

Я понимаю, что это старый вопрос, но я искал решение аналогичной проблемы со знаками + в строке GET. Я наткнулся на эту страницу и решил поделиться предложенным решением.

<?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;
?>
4 голосов
/ 20 апреля 2010

Вы должны использовать urlencode() перед помещением зашифрованной строки в строку запроса, которая будет "экранировать" любые специальные символы (включая +), а затем вызовет urldecode() перед расшифровкой, чтобы вернуть их обратно в исходную форму.

2 голосов
/ 25 мая 2018

ни один из приведенных выше ответов не помог мне, я исправил проблему со знаком «+», используя

rawurldecode() 

и

 rawurlencode() 
0 голосов
/ 18 июня 2019

Мы столкнулись с той же проблемой, пытаясь передать URL-адрес PHP-скрипту со строковой переменной, содержащей символ «+». Мы смогли заставить его работать;

encodeURIComponent([string])

EG:

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

%2B передает правильное значение в PHP GET, как сказал @hobodave, и мы получаем правильный набор данных.

Надеюсь, что это поможет кому-то еще, кто столкнулся с чем-то подобным и нуждался в немного другом взгляде на примеры выше.

0 голосов
/ 05 июня 2019

В моем случае проблема заключалась в том, что параметры $ _GET неправильно декодировались при использовании для запроса MYSQL. Поэтому, если вам просто нужно передать содержимое $ _GET в запрос mysql, просто закодируйте его (не нужно ничего декодировать) следующим образом:

<a href='processor.php?name=".urlencode($str)."'>".$str."</a></td>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...