为什么PHP在$\u COOKIE中用空格替换加号?
因此,根据我对PHP和cookie的理解,如果我使用为什么PHP在$\u COOKIE中用空格替换加号?,php,cookies,setcookie,Php,Cookies,Setcookie,因此,根据我对PHP和cookie的理解,如果我使用setcookie()函数,那么我会得到一个自动进行url编码的cookie。当我转到$\u COOKIE数组时,我应该将COOKIE取回,并自动对url进行解码。问题是,当我查看$\u cookie时,它似乎对cookie进行了两次解码 假设我有一个值为“Name | ID | Email”的cookie,例如: 乔| 123 |我的+email@somewhere.com 这将被编码为: Joe%7C123%7Cmy%2beail%40so
setcookie()
函数,那么我会得到一个自动进行url编码的cookie。当我转到$\u COOKIE
数组时,我应该将COOKIE取回,并自动对url进行解码。问题是,当我查看$\u cookie
时,它似乎对cookie进行了两次解码
假设我有一个值为“Name | ID | Email”的cookie,例如:
乔| 123 |我的+email@somewhere.com
这将被编码为:
Joe%7C123%7Cmy%2beail%40somewhere.com
注意,加号是经过编码的,所以理论上,如果我解码它,我应该把它取回来。由于这是在$\uCookie
中自动完成的,我应该回到我开始的地方。但是,我回来了:
乔| 123 |我的email@somewhere.com
注意加号以前所在的空间。如果我在cookie上运行额外的urldecode()
,这就是我所期望的。但我不是,所以我不知道为什么我会得到一个空间而不是一个加号
另一个有趣的转折。页面刷新似乎可以产生正确的输出。你知道为什么会这样吗
仅供参考,为了设置初始cookie,我使用javascript和escape()
脚本生成编码字符串。这可能是javascript和PHP之间的交接问题吗
您的想法将不胜感激。值得注意的是,“%20”和“+”都是空格字符的有效编码。根据维基百科的文章(重点添加): 提交已输入HTML表单的数据时,表单 字段名和值以HTTP格式编码并发送到服务器 使用GET或POST方法请求消息,或者历史上通过电子邮件请求消息。 默认情况下使用的编码基于 常规URI百分比编码规则,经过多次修改 例如换行符规范化和将空格替换为“+”而不是 “%20”。以这种方式编码的数据的MIME类型是 application/x-www-form-urlencoded,当前已定义(仍为 在HTML和XForms规范中 更具体地说,与PHP和JavaScript相关,请参见此问题的顶部答案:
如果不想自动编码cookie,可以使用与setcookie()相同的()函数
但使用此函数时,不能在值内使用这些字符:(,;\t\r\n\013\014): 资源中的输出-chrome中的Cookie:
Joe|123|my+email@somewhere.com
Joe%7C123%7Cmy%2Bemail%40somewhere.com
当您回显$\u COOKIE['NAME']
Joe|123|my email@somewhere.com
但是:我在PHP5.3.13中测试它的内容
setcookie("NAME","Joe|123|my+email@somewhere.com");
资源中的输出-chrome中的Cookie:
Joe|123|my+email@somewhere.com
Joe%7C123%7Cmy%2Bemail%40somewhere.com
当我回显$\u COOKIE['NAME']时:
Joe|123|my+email@somewhere.com
现在:如果您仍然对此有问题,可以使用setcookie()
函数,然后使用()对其进行解码:
echo rawurldecode($_COOKIE['NAME'])
首先,PHP总是在JavaScript之前运行——它是服务器端而不是客户端,因此在刷新页面之前,您使用JavaScript设置的cookie实际上对PHP不可用(因此出现了这个问题) 接下来JavaScript有不同的方法来编码字符串;只有一个会自动使用PHP 因此: 因此,为了进行测试,请尝试以下方法(请记住,您需要刷新页面以查看cookie值):
曲奇杂耍
document.cookie=“testuser=”+encodeURIComponent(“Joe | 123 | my+email@somewhere.com");
您是否尝试过使用JavaScript的encodeURI()
函数代替escape?如果您使用urlencode('+')
它将返回%2B
,在urldecode('%2B')
之后应该返回+
-请参阅。如果您仍然存在一些问题,您可以通过将+
替换为某些电子邮件地址禁止字符(如
)来解决此问题,并在从COOKIE恢复数据后,将
替换回+
…您的JavaScript可能会将COOKIE设置为稍微不正确,导致PHP“修复”当它第一次遇到它的时候,它就消失了。看起来你有些细节搞错了,所以我想如果没有看到你的一些代码,我们将无法进一步了解。忽略我之前的评论encodeURI()
不会对“+”符号进行编码,你需要encodeURIComponent()
-抱歉:\n没有实际的代码,很难判断发生了什么。但毫无疑问,您解码了两次,需要跟踪并删除。这可能会导致除此之外的其他问题。例如,不应将%2540解码为%40 not@。顺便说一句,我希望你不要在没有加密和使用HMAC的情况下使用该电子邮件地址来识别用户。否则,你会遇到更糟糕的问题。请参阅网站上关于黑客攻击cookies的部分
<html>
<head>
<title>Cookie Juggling</title>
<script type="text/javascript">
document.cookie = "testuser=" + encodeURIComponent("Joe|123|my+email@somewhere.com");
</script>
</head>
<body>
<div><?php echo !empty($_COOKIE['testuser']) ? $_COOKIE['testuser'] : "Cookie not set yet"; ?></div>
</body>
</html>