我正在详细了解 PHP 中 Cookie 最重要的概念之一。
在学习 Cookie 时,我发现“ Cookie的价值在发送Cookie时会自动进行网址编码,并在收到时自动解码(为防止网址编码,请使用setrawcookie()代替)。“
上述陈述在我的脑海中引起了许多疑惑,如下:
setrawcookie()
而不是setcookie()
?setcookie()
或setrawcookie()
?$_COOKIE['cookie_variable'] = 'some_value'
之类的其他变量一样设置,而不是使用setcookie()
或setrawcookie()
吗?如果有人能够通过完美,合适且易于理解的代码示例以及逐步清晰,清晰,易于理解的解释清除我上面提到的所有疑问,那对我来说将是非常有用的。< / p>
感谢。
答案 0 :(得分:13)
- 实际上通过&#34实际发生了什么; cookie的值在发送cookie时自动进行URL编码,并在收到时自动解码&#34; ?
醇>
这意味着您不必担心特殊字符。
请注意,Cookie不是PHP概念;它们是HTTP协议的扩展。并且每个协议都有一个您需要遵守的严格结构,或者它根本不起作用。该结构依赖于分隔符 - 字符,或在该协议中赋予它们特殊含义的字符序列 通过每个协议传输的数据将不可避免地包含那些特殊的字符,这就是编码是必要的原因。
例如,分号(;
)用作Set-Cookie
HTTP Header中的分隔符,因此如果您的Cookie值包含它,则需要对其进行编码,否则Cookie将无法使用浏览器在收到它时会正确解析。
如果您发送的Cookie值为foo;bar
,且未经编码,则浏览器会将其视为附加foo
标记的值bar
它。
作为数据的一部分,您将丢失;bar
,并且由于bar
根据协议是未知标志,因此浏览器会忽略它,因此您甚至不会知道存在错误一点都不。
当您使用setcookie()
设置Cookie时,PHP会自动执行编码,然后在您从$_COOKIE
超全局读取时自动解码。
- 当已经有一个可用于设置cookie值的函数setcookie()时,为什么还需要另一个函数如setrawcookie()?
醇>
主要有两个原因:
您发送的值可能已经被编码。
您希望避免双重编码,因为充其量只表示您需要做更多工作。在最坏的情况下,它可能会完全破坏数据(即您可能永远无法100%确定原始数据是什么)。
有很多方法可以对值进行编码,而setcookie()
使用的方法可能并不理想。
URL编码通常编码的数据多于cookie格式所需的数据 在极端情况下(您永远不必担心这一点),由于编码数据的大小通常比原始数据大,因此可能会导致其超过最大cookie大小(约4kb)。或者您可能只是想节省带宽。
但是,你100%知道数据不需要编码也是不常见的,所以你只想跳过那个不必要的步骤。
- URL编码和URL解码过程是不安全/有害/危险/慢/其他任何其他因素应该避免吗?
醇>
不一般,但这应该已在上面回答。
- 使用
有什么好处/弊端? 醇>setrawcookie()
而不是setcookie()
?
缺点是如果需要,您需要自己编码值 上面已经解释了这些好处。
- 哪一个是安全/更好/安全/可靠/等。
醇>setcookie()
或setrawcookie()
?
setcookie()
为不熟悉cookie protocol的人留下更少的错误空间。
但这需要付出代价 - 假设您总是需要网址编码。在编程中,假设通常是一件坏事。
对于新手,setcookie()
更容易使用
对于专家来说,setrawcookie()
减少了限制,因此更加灵活。
两者本身都没有更好,因为你提到过&#34; secure&#34; - 对安全性没有任何影响。
- 可以像其他变量一样设置Cookie,而不是使用
醇>$_COOKIE['cookie_variable'] = 'some_value'
或setcookie()
吗?
没有
答案 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)。