我尝试通过URL发送变量。所以我使用这个CI方法
$this->encrypt->encode($variable)
我在目的地解码它。但它没有返回正确的值。 编码值示例:
PWI + q72keVNJtpaZgJdxfwuKtqM2VrNMGhpnknsrf / 3dadh0x + lU70h9hgSwFzTWQAEclSfoSZ2J3 / UOuLVwgA ==
我意识到这里有太多特殊字符,例如+/=
。并允许URI中的这些字符是不明智的。
如果是这样,是否无法实现此功能以保护通过URL发送的数据?
答案 0 :(得分:1)
encode
的输出是Base64编码的加密数据。要传输它,您必须以URI安全格式对其进行编码。
在PHP base64 page上建议使用这些功能
$base64 = $this->encrypt->encode($variable);
$urisafe = strtr($base64, '+/', '-_');
// or
$urisafe = strtr($base64, '+/=', '-_,');
在decode
之前,你必须改变这一点:
$base64 = strtr($urisafe, '-_', '+/');
// or
$base64 = strtr($urisafe, '-_,', '+/=');
第一个建议使其符合用于URL安全编码的RFC 4648 Table 2。
strtr用安全字符替换有问题的字符。在上面的示例中,在编码过程中,+
被-
替换为/
,_
替换为{{1}}。
答案 1 :(得分:1)
我知道是什么让加密没有返回正确的值。这是因为它的特殊性。
pWI+q72keVNJtpaZgJdxfwuKtqM2VrNMGhpnknsrf/3dadh0x+lU70h9hgSwFzTWQAEclSfoSZ2J3/UOuLVwgA==
此值中发送的内容仅为pWI+q72keVNJtpaZgJdxfwuKtqM2VrNMGhpnknsrf
,因为/
个特殊字符而发生。
因此,如果我们想要发送这个编码值,我们必须使它安全。我们可以在解码后使用base64_encode()
并在解码前使用base64_decode()
。
就像在这个例子中一样:
编码使用
$id = '123';
$encrypted_id = $this->encrypt->encode($id);
$encrypted_id = base64_encode($encrypted_id);
//$url = 'www.trythis.com/site?id=' . $encrypted_id;
并解码
$encrypted_id = $_GET['id'];
$encrypted_id = base64_decode($encrypted_id);
$decrypted_id = $this->encrypt->decode($encrypted_id);