base64_encode转义与否

时间:2013-03-03 21:59:41

标签: php

$token = base64_encode( openssl_random_pseudo_bytes(32));

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

我是否需要在输出中转义$token

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

实际上,你可能。问题在于base64 encoding characters中的一个,索引为62的那个,实际上是由PHP编码为加号(+),加上可能得到URL解码作为浏览器发送时的空间(或者说,通过浏览器和服务器之间的某种东西 - 代理,负载均衡器,过滤器......)。

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

现代Firefox和Chrome都正确编码+到%2B(我刚测试过),标准似乎要求+必须始终编码,而 base64不需要进一步转义但是在某些情况下会出现问题(见URLs and plus signs)。

而不是让令牌冒着99.97%的时间工作(0.03%是你最需要它的那天,如墨菲规则),一个简单的解决方法是将令牌转换为十六进制字节表示:

$token = bin2hex(openssl_random_pseudo_bytes(32));

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