【问题标题】:What exactly does happen by means or URL encoding and URL decoding while dealing with cookies in PHP?在 PHP 中处理 cookie 时,通过 URL 编码和 URL 解码究竟发生了什么?
【发布时间】:2018-01-20 16:07:19
【问题描述】:

我正在向this link学习PHP中Cookies的概念

到现在我都明白了

cookie 通常用于识别用户。 cookie 是服务器嵌入在用户计算机上的一个小文件。每次同一台计算机通过浏览器请求页面时,它也会发送 cookie。使用 PHP,您可以创建和检索 cookie 值。

我研究了上述链接位置的以下演示程序:

<!DOCTYPE html>
<?php
  $cookie_name = "user";
  $cookie_value = "John Doe";
  setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/"); // 86400 = 1 day
?>
<html>
  <body>

  <?php
    if(!isset($_COOKIE[$cookie_name])) {
      echo "Cookie named '" . $cookie_name . "' is not set!";
    } else {
      echo "Cookie '" . $cookie_name . "' is set!<br>";
      echo "Value is: " . $_COOKIE[$cookie_name];
    }
  ?>

  <p><strong>Note:</strong> You might have to reload the page to see the value of the cookie.</p>

  </body>
</html>

在浏览完上述代码后,我的脑海中浮现了几个问题。我想给他们满意的答案。

  1. 由于 cookie 只不过是服务器嵌入用户计算机的文件,那么文件创建和操作代码在哪里?在没有文件操作和文件上传代码的情况下,服务器如何在用户的计算机上嵌入文件或浏览器如何将请求与 cookie 文件一起发送到服务器?
  2. 不过,如果我认为 cookie 文件已被服务器嵌入到用户的计算机上,那么该文件在我的运行 Windows 10 家庭版的计算机上位于何处?

我还阅读了如下声明:

注意: cookie 的值在发送 cookie 时自动进行 URL 编码,接收时自动解码(为防止 URL 编码,请改用 setrawcookie())。

坦率地说,我完全不明白这句话是什么意思,以及在发送和接收 cookie 时到底发生了什么。我也不知道什么是 PHP 中的 URL 编码和 URL 解码?

如果有人用很好的解释性答案和工作代码示例来解决我上述所有疑问,那就更好了。

老实说,正如我从经验丰富的 PHP 开发人员那里听说的那样,Cookie 和 Session 是 PHP 中最重要的基本概念。但是,我发现它们很难理解。所以,请用简单明了的语言向我解释,以便我可以更好、更轻松地掌握这些概念。

简而言之,我想通过工作代码示例了解 PHP 中 cookie 的概念、功能和用法。

谢谢。

【问题讨论】:

  • 1. setcookie 就是这样做的。 2. 取决于浏览器和操作系统
  • 本教程教你错。 cookie 不是文件。 cookie 只是一段数据(一个字符串)。

标签: php cookies urlencode setcookie urldecode


【解决方案1】:

存储和传输 cookie

教程不正确,或者至少有点混乱。传统上 cookie 被存储为单独的文件,但这只是一个实现细节,完全取决于客户端、浏览器、cookie 的存储方式(如果有的话)。

URL-encoding 和-decoding 是一种编码与其他序列中的URL 不兼容的特殊字符的方法,例如将空格转换为%20。这样做是为了确保 cookie 能很好地到达对方,并且可以正确存储,但就像关于文件的短语一样,它与 cookie 的使用无关。

那它有什么用呢?

cookie 的意义在于,它是一条来回发送的信息。当您调用 setcookie 时,该信息 ($cookie_value) 会与其他内容一起发送回发出请求的客户端(例如浏览器)。客户端可以存储这些信息,当它向同一个服务器发出另一个请求时,它会将 cookie 值与请求一起发送。

这允许服务器再次使用此值并识别发出请求的是同一客户端。

Cookie 的一个常见用途是创建会话,您可以在其中登录,网站会记住您的身份。在最简单的形式中(但不要这样做),cookie 值可以包含登录信息,因此在每个请求中,您都可以再次验证它是同一个用户。但是,发送这样的信息有点不安全,因为信息很容易从文件和网络流量中读取,因此您很可能会泄露私人信息此外,这不会让您区分不同的会话(当您在两台不同的 PC 或两种不同的浏览器上登录)。

更好和更常见的场景是在服务器上记住用户信息,例如在$_SESSION variable 的帮助下。不是将所有凭据都放在 cookie 中,而是生成一个链接到会话信息的唯一 ID。 session id 存储在 cookie 中。

所以,要使用 cookie,

  • 需要知道如何设置 cookie 以及如何读回它。
  • 知道它存储在浏览器中,并随着请求和响应来回发送。 (以及如何在浏览器中检查和重置其值,以便您更轻松地验证和调试代码)。
  • 可能不太关心 cookie 的编码方式,以及它在磁盘上的存储方式或位置。这些是对一般用途无关紧要的实现细节。

要拥有个会话,你根本不需要自己设置 cookie!

由于对会话的需求如此普遍,PHP 有一个完整的实现来存储会话信息并发送 cookie 来记住访问者。你甚至不必自己打电话给setcookie

最好的起点是阅读session_start() 及其相关功能。基本上,如果您在脚本开始时调用session_start(),那么您只需操作$_SESSION 变量,其中的所有值都将存储在请求之间。 cookie 的全部使用,以及会话信息在服务器上的存储,都完全被这点 PHP 魔法所掩盖。

【讨论】:

    【解决方案2】:

    浏览器使用 cookie 来存储信息,是的,它们是文件,但不会从服务器下载/上传到服务器。过程是这样的:

    • 浏览器连接到服务器并发送一些数据,包括用于识别请求(get、post 等)的标头并发送 cookie(如果存在)。
    • 服务器接收此标头并发送自己的标头,以指示浏览器重定向到另一个页面、创建 cookie 或简单地指定接下来要发送的内容类型。
    • 最后,浏览器获取服务器发送的内容并解析以呈现页面、下载文件或重定向到另一个 URL。

      1. 浏览器是编写 cookie 的人。
      2. 正如@rtfm 所说,cookie 的位置取决于浏览器和 SO。

    【讨论】:

      猜你喜欢
      • 2017-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 2011-06-18
      • 2020-10-23
      相关资源
      最近更新 更多