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

问题描述:

嗨我在使用加密函数在获取urlencoded之前加密我的URI,并在接收页面进行urldecoded后最终解密它。它的工作正常,但偶尔urldecode用空格替换所有的+,从而使我的解密功能失败。在urlencode/urldecode之前使用加密是否安全?加密的GET url不会返回相同的值,偶尔用空格替换所有的+

这里是我的加密和解密功能:

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网址:

   $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是否安全?或者我在某个地方做错了方式。

+0

'urlencode'应该将所有的'+'字符改为'%2B',所以URL中不应该有任何'+'。 – Barmar

+0

是的,它将所有的'+'字符改为'%2B',问题是当我urldecode他们所有的'%2B'偶尔被替换为空格而不是'+'字符 –

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

+0

感谢@Barmar,它现在工作正常:)我没有意识到通过使用urldecode我实际上解码了两次:P –

+0

想一想:即使浏览器自动编码所有内容,在访问URL参数时通常不需要使用urldecode。 – Barmar