Привет! Я использую функцию шифрования, чтобы зашифровать свой 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 одновременно? или я делаю это где-то неправильно.
Не звони urldecode()
в приемнике. PHP автоматически декодирует все параметры URL, прежде чем поместить их в $_GET
, Таким образом, вы расшифровываете дважды; автоматическое декодирование переводит %2B
в +
, а затем ваш звонок urldecode()
переводит +
в космос.
Других решений пока нет …