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

时间:2017-09-13 08:50:43

标签: php cookies urlencode setcookie urldecode

我正在详细了解 PHP Cookie 最重要的概念之一。

在学习 Cookie 时,我发现“ Cookie的价值在发送Cookie时会自动进行网址编码,并在收到时自动解码(为防止网址编码,请使用setrawcookie()代替)。

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

  1. 实际上通过实际发生了什么?“cookie的值在发送cookie时自动进行URL编码,并在收到时自动解码”
  2. 当已经有一个功能 setcookie()可用于设置Cookie值时,为什么还需要其他功能,例如 setrawcookie()
  3. 网址编码网址解码的过程是否安全/有害/危险/缓慢/其他任何其他因素都应该避免?
  4. 使用setrawcookie()而不是setcookie()
  5. 有什么好处/弊端?
  6. 哪一个是安全/更好/安全/可靠/等。 setcookie()setrawcookie()
  7. Cookie不能像$_COOKIE['cookie_variable'] = 'some_value'之类的其他变量一样设置,而不是使用setcookie()setrawcookie()吗?
  8. 如果有人能够通过完美,合适且易于理解的代码示例以及逐步清晰,清晰,易于理解的解释清除我上面提到的所有疑问,那对我来说将是非常有用的。< / p>

    感谢。

2 个答案:

答案 0 :(得分:13)

  
      
  1. 实际上通过&#34实际发生了什么; cookie的值在发送cookie时自动进行URL编码,并在收到时自动解码&#34; ?
  2.   

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

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

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

如果您发送的Cookie值为foo;bar,且未经编码,则浏览器会将其视为附加foo 标记的值bar它。
作为数据的一部分,您将丢失;bar,并且由于bar根据协议是未知标志,因此浏览器会忽略它,因此您甚至不会知道存在错误一点都不。

当您使用setcookie()设置Cookie时,PHP会自动执行编码,然后在您从$_COOKIE超全局读取时自动解码。

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

主要有两个原因:

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

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

  2. 有很多方法可以对值进行编码,而setcookie()使用的方法可能并不理想。

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

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

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

    不一般,但这应该已在上面回答。

      
        
    1. 使用setrawcookie()而不是setcookie()
    2. 有什么好处/弊端?   

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

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

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

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

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

    两者本身都没有更好,因为你提到过&#34; secure&#34; - 对安全性没有任何影响。

      
        
    1. 可以像其他变量一样设置Cookie,而不是使用$_COOKIE['cookie_variable'] = 'some_value'setcookie()吗?
    2.   

    没有

答案 1 :(得分:6)

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

如果您想要设置自己已经过网址编码的Cookie,则需要setrawcookie,无论出于何种原因。因此,如果您有一个已编码的Cookie,其值为%20,那么如果您使用setcookie,则会将其编码为%2520;使用setrawcookie它将按原样保留并设置为%20。换句话说,setrawcookie是一种“只是设置该死的cookie的方式,我知道我在做什么。”使用它取决于您确保cookie格式正确符合到HTTP字符编码标准。

如果您需要有关编码或转义格式的更多背景信息,请参阅The Great Escapism (Or: What You Need To Know To Work With Text Within Text)