2017-09-13 94 views
15

我正在学习最重要的概念CookiesPHP的详细信息。在PHP中,内置函数setcookie()和setrawcookie()的实际功能差异是多少?

在学习饼干我才知道那个“发送cookie时cookie的值会自动url编码,并自动在接收时解码(为防止URL编码,使用setrawcookie()代替)。

上述声明已经创造了我的脑海里这么多的质疑,内容如下:

  1. 什么实际的手段几乎发生“发送时,cookie的值会自动进行了urlencoded cookie,并在收到时自动解码“
  2. 为什么需要另一个功能,如setrawcookie()当已有函数setcookie()可用于设置cookie值?
  3. URL编码的过程URL解码不安全/有害/危险/缓慢/其他任何东西,所以它应该避免?
  4. 使用setrawcookie()超过setcookie()有什么好处/缺点?
  5. 哪一个是安全/更好/安全/可靠/等等。 setcookie()setrawcookie()
  6. 不能像其他变量一样设置Cookie,如$_COOKIE['cookie_variable'] = 'some_value'而不是使用setcookie()setrawcookie()

如果有人能清除所有我上面提到的完善,适合和容易怀疑的理解与一步一步的脆皮以及代码示例,清晰,易于掌握的解释它会有很大很大的帮助我。

谢谢。

+0

这是在我看来,一个艰巨的任务。怀疑任何人都会回答所有这些问题。 – Andreas

+0

参见'urlencode':http://php.net/manual/en/function.urlencode.php – HostFission

回答

13
  1. 什么实际的手段几乎发生“的cookie的值发送cookie时会自动url编码,并自动在接收到的解码”?

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

请注意,cookie不是PHP的概念;它们是HTTP协议的扩展。而且每个协议都有一个你需要遵守的严格结构,否则它就无法工作。该结构依赖于分隔符 - 在该协议中赋予它们特殊含义的字符或字符序列。
通过每个协议传输的数据将不可避免地包含这些特殊字符,这就是为什么编码是必要的。

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

如果您发送与foo;bar值的饼干,没有编码,浏览器将连接到它bar标志把它当作值foo
作为数据的一部分,您将丢失;bar,并且由于bar根据协议是未知标志,因此浏览器会简单地忽略它,因此您甚至不会知道有错误。

当您将cookie设置为setcookie()时,PHP将自动执行编码,然后在您从超文本对话框$_COOKIE中读取时自动对其进行解码。

  • 为什么有必要像setrawcookie另一个函数的时已经有一个函数setcookie()函数可用于设置该cookie的值()?
  • 主要有2个原因:

    1. 您发送的值可以已经进行编码。

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

    2. 有很多方法可以对值进行编码,并且一个setcookie()使用可能不合意。

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

    但是,您也知道100%数据不需要编码,因此您只是想跳过这一不必要的步骤。

    1. 是这样它应当避免URL编码和URL的解码不安全的/有害的/有害/慢/别的过程?

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

  • 什么是使用setrawcookie()超过setcookie()的好处/缺点?
  • 缺点是如果需要,您需要自己编码值。
    上面已经解释了好处。

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

    setcookie()叶从人不熟悉cookie protocol错误更少的空间。

    但是这是以牺牲成本为前提的 - 假设你总是需要URL编码。假设在编程中通常是一件坏事。

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

    两者本质上都不会更好,因为您提到“安全” - 对安全性没有任何影响。

  • 不能饼干设置像像$_COOKIE['cookie_variable'] = 'some_value'代替使用setcookie()setrawcookie()其他变量?
  • 5

    URL编码替换URLs/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)如果您首先需要更多关于哪些编码或转义格式的背景信息。

    相关问题