2011-06-06 96 views
130

幾個月前我開始使用PHP。爲了爲我的網站創建一個登錄系統,我閱讀了有關Cookie和會話及其差異的信息(Cookie存儲在用戶的瀏覽器和服務器上的會話中)。那時候,我更喜歡cookies(而不喜歡cookies?!),並且只是說:「誰在乎?我沒有任何把它存儲在我的服務器上的好處」,所以,我繼續使用cookies我的學士畢業項目。但是,在完成應用程序的大部分工作之後,我聽說對於存儲用戶ID的特殊情況,會話更合適。所以我開始考慮如果陪審團問我爲什麼使用cookies而不是會話,我會說些什麼?我只是有這個理由(我不需要存儲關於用戶的內部信息)。那就夠了作爲原因?或者它不止於此?
您能告訴我關於使用cookie保留用戶ID的優點/缺點嗎?餅乾與會話

感謝你們所有人在StackOverflow!

+0

兩種方法*存儲數據*。 Cookie在客戶端進行,即訪問者設備的存儲。會話是一個聰明的「擴展」,因爲它們只在客戶端存儲唯一的ID,在服務器端存儲所有實際的數據。當他們從客戶端的cookie收到唯一ID時,他們知道要在服務器上加載哪些數據。在大多數情況下,會議將是你需要的。順便說一句,您可以用更現代的方式使用https://github.com/delight-im/PHP-Cookie來管理這兩者。 – caw 2016-07-12 23:43:02

回答

143

這個概念是爲網頁訪問者跨頁加載存儲持久性數據。 Cookies將其直接存儲在客戶端上。會話使用cookie作爲排序的關鍵,與存儲在服務器端的數據相關聯。

它最好使用會話,因爲實際值對客戶端是隱藏的,並且您可以控制數據何時到期並變爲無效。如果它全部基於cookie,則用戶(或黑客)可以操縱他們的cookie數據,然後向您的站點播放請求。

編輯:我認爲除了簡單之外,使用cookies沒有任何優勢。以這種方式來看待......用戶是否有理由知道他們的ID號?通常我會說不,用戶不需要這些信息。提供信息應限於需要了解基礎。如果用戶更改他的Cookie以獲得不同的ID,那麼您的應用程序將如何響應?這是一個安全風險。

在會議結束之前,我基本上都有自己的實施。我在客戶端存儲了一個唯一的cookie值,並將該持久數據與該cookie值一起存儲在數據庫中。然後,在頁面請求中,我匹配了這些值,並讓我的持久數據不會讓客戶端控制那些東西。

+24

@JiminyCricket我不認爲這是真的......如果是這樣,沒有人會使用會話變量來存儲當前登錄的用戶 - 每個人都會這樣做。這將是一個巨大的安全風險。很確定,通常會話ID被存儲爲客戶端機器上的cookie,然後在服務器端與會話數據匹配。服務器通常不會通過IP地址控制會話,而是通過cookie值進行控制。 – 2013-12-12 03:55:37

+0

我最近剛剛開始只使用cookie,純粹是因爲會話不會加載頁面,除非您在同一會話中正在執行另一個頁面,除非您在每個頁面前加上'session_write_close();'當您需要它時。滾動您自己的唯一ID並使用普通Cookie進行配對並不困難,並且可以使所有頁面保持良好和活潑。 – 2017-09-20 13:54:04

85

基本思路的區分兩者。

會話:

  1. IDU存儲在服務器(即服務器端)
  2. 更安全的(因爲1)
  3. 過期不能設置,會話變量將在過期的時候用戶關閉瀏覽器。(現在它被存放24鍾如默認在PHP)

餅乾:

  1. 因爲IDU存儲在Web瀏覽器(即客戶端)
  2. 不是很安全,黑客可以達到,讓你的(因爲1)
  3. 過期可以設置(見setcookies()瞭解更多信息)
信息

如果您需要存儲短期信息/值(例如計算,測量,查詢等變量),則優先選擇會話。

當您需要存儲長期信息/值(例如用戶賬戶(即使他們關閉電腦2天,他們的賬戶仍然會被登錄)。我想不出很多cookie的例子,因爲它在大多數情況下都不被採用。

+2

我明白了,謝謝BeingSimpler,真的很簡單^^! – 2011-06-06 15:23:47

+1

一個很好的答案,我喜歡你簡單的解釋。 – Cody 2013-12-28 10:23:23

+0

請注意:這不是一個好的答案。它開始相當好,但混淆的東西,並以虛假信息結束。這不是一個會話與cookie的解釋。這是一個會話與會話+會話cookie的解釋。出於所述原因,曲奇餅本身不是優選的。出於所述原因,會話+會話Cookie是首選。 – markus 2017-09-18 17:14:49

30
SESSIONS ENDS WHEN USER CLOSE HIS BROWSER, 

COOKIES ENDS DEPENDING ON THE LIFE TIME YOU SET FOR IT. SO IT CAN LAST FOR YEARS 

這是主要的區別。在你的選擇中,

如果你想讓idu被記住很長一段時間,那麼你需要使用cookies,否則如果你只是想讓網站認識到這次訪問的用戶,那麼會話就是你的男人。

希望它有幫助:)

- 進一步的解釋。

會話存儲在您的PHP服務器將生成的文件中,並且要記住哪個文件是針對哪個用戶的,php還會在用戶瀏覽器中設置一個cookie來記錄此會話文件ID,因此在他下次訪問php時將會讀取這個文件並重新加載會話。

現在php默認情況下會清除每個時間間隔的會話,而且會話的命名規則會使它自動過期。加上瀏覽器不會保留一旦關閉/歷史記錄被清空的cookie保持會話ID。

其重要注意到nowdays瀏覽器還支持另一種存儲引擎,是: -

的localStorage,sessionStorage的,和其他webdb引擎,JavaScript代碼可用於將數據保存到您的計算機記住你。只需在facebook裏面打開javascript控制檯並輸入「localStorage」即可。它會告訴你所有的變量fb用來記住你沒有cookies。

+0

這有助於,感謝Momen。 – 2011-06-06 15:23:11

+10

實際上,默認情況下,會話持續到用戶關閉瀏覽器爲止,但是可以通過將session.cookie_lifetime = 0中的0更改爲您希望會話持續的秒數來更改php.ini文件中的內容,或者通過使用session_set_cookie_params()。 – DOK 2011-06-06 15:38:32

+1

其他有用的信息,這樣的問題,得到很多答案..很好,再次感謝DOK! – 2011-06-06 15:53:39

15

當您將#ID保存爲cookie以識別登錄用戶時,您實際上正在向與用戶無關的用戶顯示數據。另外,如果第三方試圖在瀏覽器中將隨機ID設置爲cookie數據,他們將能夠說服服務器他們是用戶,而他們實際上不是。這是缺乏安全性。

你已經使用了cookies,正如你所說你已經完成了大部分的項目。除了cookie還有很長一段時間的特權,而會話更快結束。所以在這種情況下會話不適合。在現實中,許多着名和流行的網站和服務使用cookie,您可以保持很長一段時間的登錄狀態。但是,您如何使用他們的方法創建更安全的登錄過程?

這裏的想法是:您可以幫助您使用cookies的方式:如果您使用隨機密鑰而不是ID來識別登錄用戶,首先,您不會將主要數據泄漏給隨機用戶,其次,如果你認爲隨機密鑰足夠大,任何人猜測一個密鑰或創建一個隨機密鑰都會更困難。例如,您可以在用戶瀏覽器中保存這樣一個40長度的密鑰: 「KUYTYRFU7987gJHFJ543JHBJHCF5645UYTUYJH54657jguthfn」 並且任何人都不太可能創建確切的密鑰並僞裝成其他人。

+0

好的解釋。我在令牌中使用GUID來識別單個用戶。 – Karthik 2016-01-20 08:14:17

1

會話允許您像使用cookie一樣存儲各條信息,但數據存儲在服務器而不是客戶端。

1

Session和Cookie不一樣。

會話用於存儲來自網頁的信息。通常網頁沒有任何記憶來存儲這些信息。但使用我們可以保存必要的信息。

但Cookie用於識別用戶。使用cookie我們可以存儲數據。它是存儲在用戶網頁瀏覽器中的一小部分數據。因此,無論何時用戶瀏覽器下次瀏覽器將cookie數據信息發送回服務器以獲取先前的活動時。

學分:Session and Cookie

+0

如果用戶禁用了cookies,該怎麼辦? cookie如何識別用戶? – 2016-10-06 09:56:35

0

正如有人說,會議是聰明的,具有隱藏來自客戶端的信息更具優勢。

但Cookie仍然至少有一個優勢,您可以從Javascript訪問您的Cookie(例如ngCookies)。使用PHP會話,您無法在PHP腳本之外的任何地方訪問它。

0

我將選擇會話,首先會話更安全,然後是cookie,cookie是客戶端站點數據,會話是服務器站點數據。 Cookie用於識別用戶,因爲它是用用戶計算機瀏覽器嵌入我的服務器的小塊代碼。另一方面,Session幫助你保護你的身份,因爲Web服務器不知道你是誰,因爲HTTP地址通過GET和POST方法的幫助將狀態192.168.0.1更改爲765487cf34ert8ded ... ..或其他數字。會話將用戶的數據存儲在唯一的ID會話中,即使用戶ID不能彼此匹配。 Session將單個用戶信息存儲在一個應用程序的所有頁面中。 Cookies的過期是在setcookies()的幫助下設置的,而會話過期沒有設置,當用戶關閉瀏覽器時會過期。

3

我個人使用cookies和會話。

僅當用戶點擊「記住我」複選框時纔會使用Cookie。並且在服務器上還有餅乾加密和僅數據解密。如果有人試圖編輯cookie,我們的解密器能夠檢測到它並拒絕請求。

我見過這麼多的網站,登錄信息是存儲在cookie中,任何人都可以只是簡單的改變用戶的ID和用戶名的cookies來訪問任何人的帳戶。

謝謝,