PHP - 使用GET查询的加号

时间:2010-04-20 00:46:32

标签: php get

我有一个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&amp; str =快速狐狸

哪个会将其作为加密字符串返回:

LCUT / ieVa6cl3 / 4VtzE + jd9QPT3kvHYYJFqG6tY3P0Q =

现在要解密字符串,您只需将“方法”查询更改为“解密”,如下所示:

Encrypt.php方法=解密&安培; STR = LCUT / ieVa6cl3 / 4VtzE + jd9QPT3kvHYYJFqG6tY3P0Q =

唯一的问题是,当加密的字符串被解密时,它会返回:

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

我已将问题缩小到加密字符串中的加号。 PHP的GET方法似乎将加号转换为空格。我搜索了这个错误,发现它已经被归档here。我尝试过该页面上列出的不同方法,其他方法没有成功。我得到的最接近的是:

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

然后在加密方法中使用$ fixedstring,问题是,在解密时,所有空格都转换为加号。有什么想法吗?

我知道使用POST会更有意义,但我出于特定原因使用GET。我会遗漏细节。

6 个答案:

答案 0 :(得分:36)

如果您将阅读该错误报告的全部内容,您会看到对RFC 2396的引用。其中表示+ 保留。 PHP将未编码的+符号转换为空格是正确的。

将clenhertext返回给用户时,可以使用urlencode()。因此,当用户提交用于解密的密文时,您可以urldecode()它。如果它通过GET字符串进入,PHP将自动为您执行此操作。

底线: +必须以编码值的形式提交给PHP:%2B

答案 1 :(得分:10)

我意识到这是一个老问题,但我正在寻找一个解决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;
?>

答案 2 :(得分:4)

在将加密字符串放在查询字符串上之前,您应该使用urlencode(),这将“转义”任何特殊字符(包括+),然后在解密之前调用urldecode(),将它们恢复原状。

答案 3 :(得分:2)

上述答案都没有对我有用,我使用

解决了“+”符号问题
rawurldecode() 

 rawurlencode() 

答案 4 :(得分:0)

我们遇到了同样的问题,试图将URL传递给带有包含“ +”符号的字符串变量的PHP脚本。我们能够使它起作用;

encodeURIComponent([string])

EG:

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

%2B按照@hobodave的指示将正确的值传递给PHP GET,然后我们获取正确的数据集。

希望这有助于遇到类似问题并且需要与上面示例稍有不同的其他人。

答案 5 :(得分:-1)

在我的情况下,问题是在用于MYSQL查询时,$ _ GET参数未正确解码。因此,如果您只需要将$ _GET内容传递给mysql查询,则只需对其进行编码(无需解码任何内容),就像这样:

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