2017-09-13 113 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)如果您首先需要更多關於哪些編碼或轉義格式的背景信息。

    相關問題