还有一个考虑。我最近实施了一个方案,其中发布到 PHP 脚本的一些敏感数据需要转换并作为加密 cookie 返回,它使用了我认为可以保证“安全”的所有 base64 值。所以我尽职尽责地使用 RC4 加密数据项,运行通过base64_encode输出,并愉快地将cookie返回到站点。测试似乎进展顺利,直到base64编码的字符串包含一个“+”符号。字符串被写入页面cookie没有问题。使用浏览器诊断我也可以验证 cookie 是否未更改。然后当后续页面调用我的 PHP 并通过 $_COOKIE 数组获取 cookie 时,我结结巴巴地发现字符串现在缺少“+”号。该字符的每次出现都被替换为ASCII 空间。
考虑到从那时起我读过多少类似的未解决的投诉来描述这种情况,经常引用大量使用 base64 来“安全地”在 cookie 中存储任意数据的引用,我想我会指出问题并提供我公认的笨拙的解决方案。
在您对一条数据进行任何加密后,然后使用 base64_encode 使其“cookie-safe”,通过此运行输出字符串...
// from browser to PHP. substitute troublesome chars with
// other cookie safe chars, or vis-versa.
function fix64($inp) {
$out =$inp;
for($i = 0; $i < strlen($inp); $i++) {
$c = $inp[$i];
switch ($c) {
case '+': $c = '*'; break; // definitly won't transfer!
case '*': $c = '+'; break;
case '=': $c = ':'; break; // = symbol seems like a bad idea
case ':': $c = '='; break;
default: continue;
}
$out[$i] = $c;
}
return $out;
}
在这里,我只是用其他“cookie 安全”字符替换“+”(我也决定使用“=”),然后将编码值返回到页面,以用作 cookie。请注意,正在处理的字符串的长度不会改变。当相同(或站点上的另一个页面)再次运行我的 PHP 脚本时,我将能够恢复此 cookie 而不会丢失字符。我只需要记住通过我创建的同一个 fix64() 调用将 cookie 传回,然后我可以使用通常的 base64_decode() 对其进行解码,然后在您的方案中进行任何其他解密。
我可以在 PHP 中进行一些设置,允许将 cookie 中使用的 base64 字符串传输回 PHP 而不会损坏。与此同时,这有效。“+”可能是“合法”的 cookie 值,但如果您希望能够将这样的字符串传输回 PHP(在我的情况下是通过 $_COOKIE 数组),我建议重新处理以删除冒犯的角色,并在恢复后恢复它们。还有许多其他“cookie 安全”字符可供选择。