为什么 PHP 将 plus 替换为 $_COOKIE 中的空格?

2022-08-30 21:19:07

因此,根据我对PHP和cookie的理解,如果我使用该函数,那么我得到一个自动URL编码的cookie。当我进入数组时,我应该找回cookie,自动对url进行解码。问题是,当我查看时,它似乎正在解码cookie两次。setcookie()$_COOKIE$_COOKIE

假设我有一个 Cookie,其值为“名称|ID|电子邮件”,例如:

乔|123|my+email@somewhere.com

这将编码为:

Joe%7C123%7Cmy%2Mail%40某处.com

请注意,加号是编码的,所以从理论上讲,如果我解码它,我应该把它拿回来。由于这是在 中自动完成的,我应该找回我开始的东西。但相反,我回来了:$_COOKIE

乔|123|我的 email@somewhere.com

注意加号曾经所在的空间。这是我期望的,如果我在饼干上运行额外的。但我不是,所以我不知道为什么我会得到一个空间而不是一个加号。urldecode()

另一个有趣的转折。页面上的刷新似乎会产生正确的输出。任何想法为什么它的行为是这样的?

仅供参考,要设置初始cookie,我使用javascript和脚本来生成编码字符串。这可能是javascript和PHP之间的交接问题吗?escape()

想法将不胜感激。


答案 1

值得注意的是,“%20”和“+”都是空格字符的有效编码。根据维基百科关于URL编码的文章(着重号是后加的):

提交已输入到 HTML 表单中的数据时,将使用方法 GET 或 POST 或过去通过电子邮件对表单字段名称和值进行编码,并在 HTTP 请求消息中发送到服务器。默认情况下使用的编码基于通用 URI 百分比编码规则的非常早期版本,并进行了许多修改,例如换行符规范化以及将空格替换为“+”而不是“%20”。以这种方式编码的MIME类型的数据是appplication/x-www-form-urlencoded的,它目前在HTML和XForms规范中被定义(仍然以非常过时的方式)。

更具体地与PHP和JavaScript相关,请参阅有关此问题的顶部答案:

何时将空间编码为加号 (+) 或 %20?


答案 2

首先,PHP将始终在JavaScript之前运行 - 它是服务器端而不是客户端,因此您使用JavaScript设置的cookie实际上不适用于PHP,直到您刷新页面(因此存在此问题)。

接下来,JavaScript有不同的方法来编码字符串;只有一个会自动使用PHP。

所以:

document.cookie = "testuser=" + "Joe|123|my+email@somewhere.com";
// Joe|123|my email@somewhere.com (when decoded by PHP)

document.cookie = "testuser=" + escape("Joe|123|my+email@somewhere.com");
// Joe|123|my email@somewhere.com (when decoded by PHP)

document.cookie = "testuser=" + encodeURI("Joe|123|my+email@somewhere.com");
// Joe|123|my email@somewhere.com (when decoded by PHP)

document.cookie = "testuser=" + encodeURIComponent("Joe|123|my+email@somewhere.com");
// Joe|123|my+email@somewhere.com 

因此,为了进行测试,请尝试此操作(请记住,您需要刷新页面才能看到cookie值):

<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>

推荐