PHP - 使用GET查询的加号

use*_*ser 34 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;
?>
Run Code Online (Sandbox Code Playgroud)

加密字符串的URL示例如下所示:

Encrypt.php?method = encrypt&str =快速狐狸

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

LCUT/ieVa6cl3/4VtzE + jd9QPT3kvHYYJFqG6tY3P0Q =

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

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

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

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

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

$fixedstring = str_replace(" ", "+", $string);
Run Code Online (Sandbox Code Playgroud)

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

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

hob*_*ave 42

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

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

底线: +必须作为编码值提交给PHP:%2B

  • 这是您问题的正确答案.如果要在URL中的任何位置使用文字加号,无论使用何种服务器端语言,都必须对其进行编码,例如将其替换为"%2B".这是因为URL中的加号用作空格字符的替代,并且任何服务器端脚本都会将它们正确地解释为空格字符. (2认同)

And*_*rew 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;
?>
Run Code Online (Sandbox Code Playgroud)


Ale*_*ico 7

以上答案都不适合我,我使用修复了“+”号问题

rawurldecode() 
Run Code Online (Sandbox Code Playgroud)

 rawurlencode() 
Run Code Online (Sandbox Code Playgroud)


Cha*_*rch 5

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