在url编码/url解码之前使用加密是否安全。加密的 GET url 没有 return 相同的值,偶尔用空格替换所有 +

Is it safe to use encryption before urlencode /urldecode. encrypted GET url does not return same value, replacing all + with spaces occasionally

您好,我正在使用加密函数来加密我的 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 ) ) ), "[=12=]");
    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);

同时使用 encryption/decryption 和 URlencode / urldecode 安全吗?或者我在某处做错了。

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