在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是否安全?或者我在某个地方做错了方式。
请勿在接收器中调用urldecode()
。 PHP在将它们放入$_GET
之前会自动解码所有URL参数。所以你解码两次;自动解码将%2B
翻译为+
,然后您拨打urldecode()
将+
翻译为空格。
感谢@Barmar,它现在工作正常:)我没有意识到通过使用urldecode我实际上解码了两次:P –
想一想:即使浏览器自动编码所有内容,在访问URL参数时通常不需要使用urldecode。 – Barmar
'urlencode'应该将所有的'+'字符改为'%2B',所以URL中不应该有任何'+'。 – Barmar
是的,它将所有的'+'字符改为'%2B',问题是当我urldecode他们所有的'%2B'偶尔被替换为空格而不是'+'字符 –