0

我使用 PHP 在 PHP 中生成会话 cookie

$cookie = random_bytes(64);

然后将此变量的值设置为 cookie:

setcookie('access', $cookie, time()+31536000, '/', false);

当我使用

function getAccessToken(){
    var n = document.cookie.match(/access=([^;]+)(?:$|;)/i);
    if (n && n.length)
        return n[1];
}

在客户端,我得到

"%1D%D8%E1%3F%7E%3E%D7b%A5%04%3Bl%3A%ADB%DF%DAg%E5%1DH%0A%21%5E%15%D9%2Be8k%3A%E2%AF%CE7%F2%BF%5B%CB%14%95%CEO%28%60p%DF%FBeY%95%3C%86%B99U%B7%F1p%E0%AC%2B%C5%2F"

该值被发送到 Node.js websocket 服务器以对用户进行身份验证,但由于客户端的值已经错误,因此连接失败。当 PHP 接收到这个 cookie 时,它​​会自动解码,并$_COOKIE['access']正确包含

��?~>�b�;l:�B��g�H
!^�+e8k:����7��[���O(`p��eY�<��9U��p ��+�/

我看到的所有地方都被告知使用decodeURI/decodeURIComponentescape,但是第一次抛出URIError: URI malformed和第二次抛出对我没有丝毫帮助。

如何在客户端或 Node.js 上将此原始 URL 编码字符串转换为实际字符/字节的字符串(无论哪一方进行解码)?

4

2 回答 2

1

根据@BlackBurn027的评论,我所做的只是bin2hex在设置 cookie 值之前添加了一个额外的步骤:

$cookie = bin2hex(random_bytes(64));

这会产生一个字符串,两种语言都可以轻松理解而不会出现问题。

于 2016-06-18T10:29:27.093 回答
-1

问题是你随机生成字节,所以如果你尝试“解码”它们,就不会有 ASCII 字符,所以你会看到那个“?” 签名和更多随机字母,如其他语言字母(例如日语,俄语)......

最好的方法是创建一个您确定知道的函数,该函数将返回 AZ、az、0-9 和特殊字符,如“!?=$#”或您允许的任何字符。

所以,我通常做的是获取 phpsession id 并在其上执行 MD5,然后获取 MD5 的随机部分(绝不是整个字符串)并执行其他 MD5,然后总结任何内容,当前年份 + 月份 + 日期,或任何随机数字 o 随便你。然后其他 MD5... 你明白了吗?

告诉我这是否回答了您的问题!

于 2016-06-18T10:25:55.633 回答