表单安全令牌 (CSRF) - 为什么在 bin2hex(random_bytes(32)) 中使用 bin2hex

form security token (CSRF) - why use bin2hex in bin2hex(random_bytes(32))

我正在尝试向我的表单添加一个令牌以增强安全性(即 CSRF)。到目前为止,我所发现的(在 Whosebug 和许多其他网站上)是使用的建议:

$_SESSION['token'] = bin2hex(random_bytes(32));

我的问题很直接,为什么不直接使用:

$_SESSION['token'] = random_bytes(32);

为什么要将其转换为十六进制表示形式?

谢谢

随机字节不会轻易作为表单字段中的标记传递。您需要一些可预测的字符集。只是随机的字节流几乎肯定会破坏表单使用的任何客户端编码(utf-8、iso-8859-1、win1252、big5 等)。

另一方面,bin2hex 编码的字符将始终是纯 ASCII 字符串,因此它们在客户端上的任何编码都是安全的。