Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么PHP在$\u COOKIE中用空格替换加号?_Php_Cookies_Setcookie - Fatal编程技术网

为什么PHP在$\u 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

因此,根据我对PHP和cookie的理解,如果我使用
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>