在 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
/ decodeURIComponent
和 escape
,但第一个抛出 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));
这会生成两种语言都可以毫无问题地轻松理解的字符串。
我在 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
/ decodeURIComponent
和 escape
,但第一个抛出 URIError: URI malformed
而第二个对我没有丝毫帮助.
如何在客户端或 Node.js 上将这个原始 URL 编码的字符串转换为实际的 characters/bytes 字符串(哪一方进行解码无关紧要) ?
问题是您随机生成字节,所以如果您尝试 "decode" 它们,将不会有 ASCII 字符,所以您会看到“?”符号和更多随机字母,如其他语言字母(例如日语、俄语)...
最好的方法是创建一个您肯定知道 return A-Z、a-z、0-9 和特殊字符(如“!?=$#”或您允许的任何字符)的函数。
所以,我通常做的是获取 phpsession id 并对其执行 MD5,然后获取 MD5 的随机部分(从不是整个字符串)并执行其他 MD5,然后求和,当前年份 + 月份 +日期,或任何你想要的随机数。那么其他MD5...你明白了吗?
告诉我这是否回答了您的问题!
基于bin2hex
步骤:
$cookie = bin2hex(random_bytes(64));
这会生成两种语言都可以毫无问题地轻松理解的字符串。