PHP - 带 GET 查询的加号

2022-08-30 11:41:07

我有一个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=the quick fox

这将返回此作为加密字符串:

LCuT/ieVa6cl3/4VtzE+jd9QPT3kvHYYJFqG6tY3P0Q=

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

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

唯一的问题是,当解密该加密字符串时,它将返回以下内容:

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

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

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

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

我知道使用POST会更有意义,但我使用GET是出于特定原因。我将省略细节。


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

推荐