代码之家  ›  专栏  ›  技术社区  ›  user

带get查询的php-plus符号

  •  24
  • user  · 技术社区  · 15 年前

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

    它将以加密字符串的形式返回:

    lcut/ieva6cl3/4vtze+jd9qpt3kvhyyjfqg6ty3p0q=

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

    encrypt.php?方法=解密&str=lcut/ieva6cl3/4vtze+jd9qpt3kvhyyjfqg6ty3p0q=

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

    _

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

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

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

    我知道使用post会更有意义,但我使用get是出于特定的原因。我不谈细节。

    4 回复  |  直到 7 年前
        1
  •  35
  •   hobodave    15 年前

    如果您阅读整个bug报告,您将看到 RFC 2396 . 说明+是 保留 . php将未编码的+符号转换为空格是正确的。

    当返回给用户时,可以使用urlencode()密文。因此,当用户提交密文进行解密时,可以将其urlcode()。如果PHP也通过get字符串进入,它将自动为您完成这项工作。

    底线: 必须将+作为编码值提交到PHP中:%2b

        2
  •  10
  •   Andrew    13 年前

    我意识到这是一个老问题,但我在寻找一个解决类似问题的方法,在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
  •  4
  •   Chad Birch    15 年前

    你应该用 urlencode() 在将加密字符串放入查询字符串之前,它将“转义”任何特殊字符(包括 + )然后打电话 urldecode() 在解密它之前,要将它们恢复到原来的形式。

        4
  •  2
  •   Alex Angelico    7 年前

    上面的答案对我都不起作用,我用修正了“+”符号的问题。

    rawurldecode() 
    

     rawurlencode()