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

PHP*_*Fan 16 php cookies urlencode setcookie urldecode

我正在学习的最重要的概念之一饼干PHP中的细节.

在研究Cookies的过程中,我发现" cookie的价值在发送cookie时自动进行URL编码,并在收到时自动解码(以防止URL编码,改为使用setrawcookie()). "

上述陈述在我的脑海中引起了如此多的疑虑,如下:

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

如果有人能够通过完美,合适且易于理解的代码示例以及逐步清晰,清晰,易于理解的解释清除我上面提到的所有疑问,那将对我有很大的帮助.

谢谢.

Nar*_*arf 14

  1. 实际上通过"cookie的值在发送cookie时自动URL编码,并在收到时自动解码"实际发生了什么?

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

请注意,cookie不是PHP概念; 它们是HTTP协议的扩展.并且每个协议都有一个您需要遵守的严格结构,或者它根本不起作用.该结构依赖于分隔符 - 字符,或在该协议中赋予它们特殊含义的字符序列.
通过每个协议传输的数据将不可避免地包含那些特殊的字符,这就是编码是必要的原因.

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

如果您发送的cookie值为foo;bar,而不进行编码,则浏览器会将其视为附加foobar 标记的值.
你会丢失;bar作为数据的一部分,因为bar根据协议是一个未知的标志,浏览器将完全忽略它,所以你甚至不知道有任何错误.

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

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

主要有两个原因:

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

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

  2. 有许多方法可以对值进行编码,并且setcookie()使用这些方法可能并不理想.

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

但是,你100%知道数据不需要编码也是不常见的,所以你只想跳过那个不必要的步骤.

  1. URL编码和URL解码的过程是不安全/有害/危险/慢/其他任何其他应该避免的吗?

不是一般的,但这应该已经在上面回答了.

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

缺点是如果需要,您需要自己编码值.
上面已经解释了这些好处.

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

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

但这需要付出代价 - 假设您总是需要URL编码.在编程中,假设通常是一件坏事.

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

两者本身都不是更好,因为你提到"安全" - 对安全性没有任何影响.

  1. 不能像其他变量那样设置cookie $_COOKIE['cookie_variable'] = 'some_value'而不是使用setcookie()setrawcookie()

没有.


dec*_*eze 6

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

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

如果您需要有关编码或转义格式的更多背景信息,请参阅Great Escapism(或者:您需要知道如何处理文本中的文本).