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

时间:2016-06-18 10:12:07

标签: javascript php node.js cookies percent-encoding

我使用

在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;升:BGH
^ + E8K:7 [O(`PEY < 9Up + /

我看到的每个地方都被告知要使用decodeURI / decodeURIComponentescape,但是第一次投掷URIError: URI malformed而第二次投掷对我没有任何帮助。< / p>

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

2 个答案:

答案 0 :(得分:1)

基于@BlackBurn027's comment,我所做的就是在设置Cookie值之前添加额外的bin2hex步骤:

$cookie = bin2hex(random_bytes(64));

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

答案 1 :(得分:-1)

问题是你是在随机生成字节,所以如果你试图&#34;解码&#34;它们,不会有ASCII字符,所以你会看到&#34;?&#34;标志和更多随机字母像其他语言字母(例如日语,俄语)......

最好的方法是创建一个功能,你肯定知道它将返回A-Z,a-z,0-9和特殊字符,如&#34;!?= $#&#34;或任何你允许的。

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

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