在 JavaScript 中解码原始 URL 编码的 cookie

Decoding raw URL-encoded cookie in JavaScript

我在 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 编码的字符串转换为实际的 characters/bytes 字符串(哪一方进行解码无关紧要) ?

问题是您随机生成字节,所以如果您尝试 "decode" 它们,将不会有 ASCII 字符,所以您会看到“?”符号和更多随机字母,如其他语言字母(例如日语、俄语)...

最好的方法是创建一个您肯定知道 return A-Z、a-z、0-9 和特殊字符(如“!?=$#”或您允许的任何字符)的函数。

所以,我通常做的是获取 phpsession id 并对其执行 MD5,然后获取 MD5 的随机部分(从不是整个字符串)并执行其他 MD5,然后求和,当前年份 + 月份 +日期,或任何你想要的随机数。那么其他MD5...你明白了吗?

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

基于,我所做的只是在设置 cookie 值之前添加一个额外的 bin2hex 步骤:

$cookie = bin2hex(random_bytes(64));

这会生成两种语言都可以毫无问题地轻松理解的字符串。