2013-01-04 217 views
3

我前段時間看了一遍,它對我來說仍然很模糊。我想知道,如果有關會話下面的事情是正確的,當我使用這個:$_SESSION['username'] = "pete";php會話安全

  • $_SESSION是一個全局變量,只能在服務器上進行更改
  • $_SESSION['username']聲明一個cookie會在客戶端設置
  • 這意味着客戶端可以查看數據,但不能編輯它
  • $_SESSION['username']被宣佈爲cookie將在服務器端進行設置以及

如果第三個陳述是真的,那麼爲什麼我不能找到它裏面的用戶名的cookie,如果我登錄?我找到一個會話cookie,但它包含一個代碼,如tkcsq66lucpra9m7j3ogqol5h7。現在不是一個名字嗎?

+0

Cookie將只包含會話ID。並且會話數據根據您的php.ini設置爲「session.save-path」存儲在文件或數據庫中。 – yajakass

回答

15

$_SESSION是一個全局變量,只能在服務器

這是一個超級全局......但一個是填充了腳本的執行之間保存數據的改變。

$_SESSION['username']被宣佈爲cookie將在客戶端

第一個cookie(除非設置已擺弄)當會話啓動時會創建設置

這意味着客戶端可以查看數據,但不能編輯它

號cookie包含會話ID,而不是數據

$_SESSION['username']被宣佈爲cookie將在服務器端進行設置以及

Cookies只會在客戶機上存儲。數據將被存儲在服務器上,並且將與存儲在發送給瀏覽器的cookie中的標識符相關聯。

如果第三個陳述是真的,那麼爲什麼我不能找到它裏面的用戶名的cookie,如果我登錄?

這是不正確的。

我找到一個會話cookie,但它包含一個代碼,如tkcsq66lucpra9m7j3ogqol5h7。

這就是標識符。

如果您正在構建自己的會話系統(而不是使用PHP的內置庫的話),那麼你可以存儲這樣的事情在一個數據庫:

session      key  value 
tkcsq66lucpra9m7j3ogqol5h7 username pete 

Session庫就可以填充$_SESSION"username" => "pete"當會話開始時,它會收到一個包含sessionId=tkcsq66lucpra9m7j3ogqol5h7的cookie。

PHP的內置系統並不是那麼便宜和討厭(並且它透明,所以你不必擔心實現的細節)。

+0

你的解釋比我在網上找到的垃圾清晰十倍。多謝,夥計。 – user1534664

+0

當用戶在Cookie中編輯會話ID時會發生什麼? – user1534664

+2

然後他們有可能劫持別人的會話,但幾乎肯定會嘗試訪問一個不存在的會話。我不知道PHP是否會用該ID創建一個新會話或拋出異常。這足以測試你是否感興趣。 – Quentin

0

cookie中的這個字符串「tkcsq66lucpra9m7j3ogqol5h7」是會話標識符。 全部$_SESSION只能訪問服務器的數據。

0

客戶端上的cookie是對服務器端會話內容的引用,用於存儲會話的任何存儲機制。

因此,如果您的會話設置將會話數據存儲在文件中,那麼您的服務器上會有一個名爲tkcsq66lucpra9m7j3ogqol5h7的文件,它具有會話數據(或者,如果您使用會話數據的memcached,則會有memcached密鑰與該會話密鑰)。