我使用
在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
/ decodeURIComponent
和escape
,但是第一次投掷URIError: URI malformed
而第二次投掷对我没有任何帮助。< / p>
如何在客户端OR Node.js上将此原始URL编码的字符串转换为实际字符/字节的字符串(解码的哪一方无关紧要)?
答案 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 ......你明白了吗?
告诉我这是否回答了你的问题!