在urlencode / urldecode之前使用加密是否安全。加密的GET url不会返回相同的值,偶尔会将所有+替换为空格

时间:2016-03-22 19:09:49

标签: php encryption get urlencode urldecode

您好我正在使用加密函数来加密我的URI,然后再获取urlencoded并在我在接收页面中进行urldecoded之后最终将其解密。它的工作正常,但偶尔urldecode用空格替换所有+因此使我的解密函数失败。

以下是我的加密和解密功能:

function encryptIt( $q ) {
    $cryptKey  = 'aJB0rGtIn5UB1xG40efydp';
    $qEncoded      = base64_encode( mcrypt_encrypt( MCRYPT_RIJNDAEL_256, md5( $cryptKey ), $q, MCRYPT_MODE_CBC, md5( md5( $cryptKey ) ) ) );
    return( $qEncoded );
}

function decryptIt( $q ) {
    $cryptKey  = 'aJB0rGtIn5UB1xG40efydp';
    $qDecoded      = rtrim( mcrypt_decrypt( MCRYPT_RIJNDAEL_256, md5( $cryptKey ), base64_decode( $q ), MCRYPT_MODE_CBC, md5( md5( $cryptKey ) ) ), "\0");
    return( $qDecoded );
}

以下是我准备GET Url的方法:

                $encrypted_id = encryptIt( $id );

                $uri=urlencode($encrypted_id);
                $uri="http://example.com/xyz.php?id=".$uri; 

然后是我的接收脚本:

               $id=urldecode($_GET['id']);
               $id=decryptIt($id);

同时使用加密/解密和URlencode / urldecode是否安全?或者我在某处做错了。

1 个答案:

答案 0 :(得分:4)

不要在接收器中呼叫urldecode()。 PHP在将它们放入$_GET之前自动解码所有URL参数。所以你要解码两次;自动解码会将%2B翻译为+,然后您对urldecode()的调用会将+翻译为空格。