Подтвердить что ты не робот

Знак PHP - Plus с запросом GET

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

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

Теперь для дешифрования строки все, что вам нужно сделать, это изменить запрос метода на "расшифровать", например:

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Я понимаю, что это старый вопрос, но я искал решение подобной проблемы с + знаками в строке 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;
?>

Ответ 3

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

Ответ 4

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

rawurldecode() 

а также

 rawurlencode() 

Ответ 5

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

encodeURIComponent([string])

НАПРИМЕР:

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

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

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

Ответ 6

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

<a href='processor.php?name=".urlencode($str)."'>".$str."</a></td>