簡體   English   中英

用於php應用程序的cookie與會話

[英]cookies vs sessions for php application

在實現php登錄系統會話或cookie時會有什么好處?

瀏覽器cookie:

  • 在客戶端(瀏覽器)和服務器(PHP)之間共享
    • 除其他外,這意味着“ 用戶可以直接讀/寫數據,你無法控制或限制這個
  • 尺寸有限(4K)
  • 在每個頁面請求中完整發送

PHP會話:

  • 僅存儲在服務器上
  • 可以比餅干大得多
  • 通過小cookie或請求參數訪問

PHP會話在后台創建一個cookie(默認情況下名為PHPSESSID ,可由session_name()配置),因此您可以使用cookie。 可以將會話配置為 使用cookie,但是從cookie支持實際上是一個問題的時候開始,這是一個相當復雜的解決方法。 它的作用:重寫它可以在輸出中找到的所有URL,附加?PHPSESSID=your_session_id給它們。 問題:它曾經錯過了一些URL,而且URL看起來很難看(恕我直言)。 我很久沒見過非cookie的PHP會話(自2002年以來)。

PHP會話與cookie不同,但是在默認配置中,它們使用cookie來存儲會話數據的“索引”/“指針”。 會話數據存儲在PHP服務器上,當您有現有的會話ID時,腳本可以訪問相應的數據; 而對於純cookie,您必須將數據保存到cookie本身。 Cookie受大小限制,並在每個頁面請求時發送,因此只發送幾個字節長的cookie並將數據存儲在服務器上是有意義的。

例:

$_COOKIE: {
    'PHPSESSID' => 'a123456ebdf123'
}

$_SESSION: {
     'user_name' => 'Piskvor',
     8 => 'sadfsadfsdf',
     'huge block of text' => '(a huge block of text could be here, 
          as PHP sessions can usually be bigger than the measly 4K 
          allowed for a cookie)'
}


/tmp/php_sessions/sess_a123456ebdf123 (a file on server, note the name):
(whatever you see in $_SESSION above, passed through serialize())

這也意味着你永遠不應該存儲你不希望用戶看到或修改的cookie數據 - 例如,如果你的代碼設置了一個logged-in-user: Piskvor的cookie logged-in-user: Piskvor ,甚至is-admin: 1 logged-in-user: Piskvor is-admin: 1 ,那里有您無法阻止用戶使用內置瀏覽器工具執行相同操作。 將此存儲在會話變量中更安全,因為數據不直接暴露給用戶,除非您的代碼允許 - 所有用戶看到的都是會話ID(會話ID不完美,請參閱“會話劫持”) - 但它們比cookie更安全。

編輯TL; DR人群:使用會話時,他們通常由cookie支持,但它們不是同一個東西。 我建議使用會話(出於上述原因;請注意這通常意味着“通過cookie”)。

Cookie存儲在用戶的瀏覽器中。 會話存儲在服務器端。

如果您有任何敏感信息,請不要將它們放在cookie中,因為用戶 - 或有權訪問其計算機的人 - 可以使用它們執行各種令人討厭的事情。

如果您正在做出任何決定 - 比如決定某人是否已登錄或具有管理員權限 - 您可以使用該cookie,然后將其映射到具有有趣/重要位的會話。

雖然您可以將Cookie設置為過期,但由於它們存儲在瀏覽器中,因此可以由惡意用戶進行調整。 我之前調整了自己的cookie,永遠不必再登錄。 ;)由於會話是服務器端的 - 並且不必與用戶共享 - 您可以確保會話在您需要時到期。

雖然你需要注意會話固定或重放攻擊..所以它們也不完美。

保存在cookies中:

  1. $ USER_ID
  2. $散列=散列( 'SHA512',$鹽。$ IP。$ USER_ID)

並且在驗證時檢查user_id的散列是否等於存儲在cookie中的散列。 這樣你就不必在服務器端存儲任何東西。

更好? 都不是。

HTTP是一種無狀態協議(無會話),用於創建某種會話,您可以使用cookie(在客戶端存儲cookie中的值並將其與每個請求一起傳遞)或將值作為URL參數傳遞(例如?sessionid = 2358734578}。

PHP會話只是為每個客戶端分配一個sessionid並將其存儲在cookie中,這充當客戶端的標識符(您也可以將其配置為使用URL參數)。

基本上,您可以使用本機PHP會話實現,它在服務器端存儲所有內容,為客戶端提供通過cookie傳遞的ID,然后提供一種方法,您可以根據所述ID(通過以下方式)檢索該會話的數據cookie) - 或者你可以提出你自己的系統(你稱之為'使用cookies'),但最終它不會更好〜雖然作為雙產品你可能最終理解HTTP如何工作那么一點多一點 :)

另請參閱CaseySoftware關於安全性考慮的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM