PHP中内置函数setcookie()和setrawcookie()在功能上的实际区别是什么?

2022-08-30 23:28:48

我正在详细学习PHPCookies最重要的概念之一。

在研究Cookie时,我了解到“Cookie的值在发送cookie时自动进行URLen编码,并在收到时自动解码(为了防止URLencoding,请使用setrawcookie()代替)。"

上述说法在我心中产生了如此多的疑惑,具体如下:

  1. 通过“Cookie的值在发送cookie时自动URLencoded,并在收到时自动解码”,实际上发生了什么?
  2. 为什么需要另一个函数,如 setrawcookie() 当已经有一个函数 setcookie() 可用于设置 cookie 值时?
  3. URL编码URL解码的过程是否不安全/有害/危险/缓慢/其他任何事情,因此应该避免?
  4. 使用over有什么好处/缺点?setrawcookie()setcookie()
  5. 哪一个是安全/更好/安全/可靠/等。 或?setcookie()setrawcookie()
  6. 难道不能像其他变量一样设置 Cookie,而不是使用 或 ?$_COOKIE['cookie_variable'] = 'some_value'setcookie()setrawcookie()

如果有人能用完美,合适和易于理解的代码示例以及一步一步的脆皮,清晰,易于掌握的解释来清除我上面提到的所有疑问,那对我来说将有很大的帮助。

谢谢。


答案 1
  1. 通过“Cookie的值在发送cookie时自动URLencoded,并在收到时自动解码”,实际上发生了什么?

这意味着您不必担心特殊字符。

请注意,Cookie不是PHP概念;它们是HTTP协议的扩展。每个协议都有一个严格的结构,你需要遵守,否则它就根本行不通。该结构依赖于分隔符 - 在该协议中分配给它们的字符或具有特殊含义的字符序列。
通过每个协议传输的数据不可避免地会包含这些特殊的通道,这就是为什么编码是必要的。

例如,分号 () 在 Set-Cookie HTTP 标头中用作分隔符,因此,如果您的 cookie 值包含它,则需要对其进行编码,否则浏览器在收到它时将无法正确解析该 Cookie。;

如果您发送值为 的 Cookie 而不进行编码,浏览器会将其视为带有附加标志的值。
您将作为数据的一部分丢失,并且由于根据协议是未知标志,浏览器将简单地忽略它,因此您甚至根本不知道存在错误。foo;barfoobar;barbar

PHP会在你设置cookie时自动进行编码,然后在你从超全局读取时自动解码它。setcookie()$_COOKIE

  1. 为什么需要另一个函数,如 setrawcookie() 当已经有一个函数 setcookie() 可用于设置 cookie 值时?

主要原因有2个:

  1. 您发送的值可能已被编码。

    您希望避免双重编码,因为充其量这意味着您需要做更多的工作。在最坏的情况下,它可能会完全损坏数据(即您可能永远无法100%确定原始数据是什么)。

  2. 有许多方法可以对值进行编码,并且使用的方法可能不可取。setcookie()

    URL 编码通常编码的数据比 Cookie 格式需要的要多。
    在极端情况下(您永远不必担心这一点),由于编码数据的大小通常大于原始数据,因此可能会导致其超过最大cookie大小(约4kb)。或者您可能只是想节省带宽。

但是,您100%知道数据不需要编码的情况也并不少见,因此您只想跳过不必要的步骤。

  1. URL编码和URL解码的过程是否不安全/有害/危险/缓慢/其他任何事情,因此应该避免?

不是一般的,但上面应该已经回答过了。

  1. 使用over有什么好处/缺点?setrawcookie()setcookie()

缺点是,如有必要,您需要自己对值进行编码。
同样,好处已经在上面解释过了。

  1. 哪一个是安全/更好/安全/可靠/等。 或?setcookie()setrawcookie()

setcookie()为不熟悉cookie协议的人留下更少的错误空间。

但这是有代价的 - 假设你总是想要URL编码。假设在编程中通常是一件坏事。

对于新手来说,更容易使用。
对于专家来说,限制更少,因此更灵活。setcookie()setrawcookie()

两者本质上都不是更好,而且既然你提到了“安全”,那么两者都不会对安全性产生任何影响。

  1. 难道不能像其他变量一样设置 Cookie,而不是使用 或 ?$_COOKIE['cookie_variable'] = 'some_value'setcookie()setrawcookie()

不。


答案 2

URL编码将URL / HTTP中具有特殊含义的特定字符替换为百分比编码字符,例如,空格变为。请参阅 https://en.wikipedia.org/wiki/Percent-encoding 了解血腥的细节。%20

无论出于何种原因,如果您想设置一个您已经对URL编码的cookie,则需要这样做。因此,如果您有一个已经编码的cookie,其中包含该值,则如果您使用它将被编码为;使用它将按原样保留,并设置为 。换句话说,是一种“只要设置该死的饼干,我就知道自己在做什么”的方法。使用它,您可以确保 Cookie 格式正确符合 HTTP 字符编码标准。setrawcookie%20setcookie%2520setrawcookie%20setrawcookie

请参阅伟大的逃避主义(或:你需要知道什么来处理文本中的文本),如果你首先需要更多关于编码或转义格式的背景信息。


推荐