0
$token = base64_encode( openssl_random_pseudo_bytes(32));

<input type="hidden" name="csrf_token" value="<?=$token?>">

我需要转义$token输出吗?

4

2 回答 2

2

转义 base64 编码数据是没有意义的,根据定义,它内部不会有任何控制字符(或引号等)。

于 2013-03-03T22:01:11.043 回答
0

实际上,你可能. 问题在于,base64 编码字符之一,即索引为 62 的字符,实际上被 PHP 编码为加号 (+),并且该加号在发送时可能会被浏览器URL 解码为空格沿着(或者更确切地说,通过浏览器和服务器之间的某些东西 - 代理,负载平衡器,过滤器......)。

因此,某些数据可能会以一种形式编码,然后将其解码为不同的字符串(实际上根本不会被解码,因为空间会破坏 base64 方案)。

现代 Firefox 和 Chrome 都正确地将 + 编码为 %2B (我刚刚测试过),并且标准似乎规定 + 必须始终进行编码,并且base64 不需要进一步转义,但在某些情况下会出现问题(参见URL 和 plus标志)。

与其冒险代币在 99.97% 的时间里工作(0.03% 是你最需要它的日子,墨菲规定),一个简单的解决方法是将代币转换为十六进制字节表示:

$token = bin2hex(openssl_random_pseudo_bytes(32));

<input type="hidden" name="csrf_token" value="<?=$token?>">
于 2013-03-03T22:15:58.283 回答