2016-08-11 106 views
2

我在我的網站上建立了一個登錄名,如果登錄成功,我會設置一個$_SESSION['user']變量。SESSION登錄易受攻擊?

現在我保護所有內容由

if(!isset($_SESSION['user'])) { 
    header('Location: login.php'); 
} 

這意味着,如果還沒有登錄成功,你直接回到登錄頁面登錄的用戶。

現在我的問題:這是安全的嗎?其他網站是否已設置$_SESSION['user']變量?

+1

會話寫入web服務器上的文件,以便其他網站可以設置一個叫做'user'會話,但它會在不同的網站進行設置,有效的在不同的網站 – RamRaider

回答

1

您的網站的會話創建服務器計算機上的唯一散列和文件的哈希存儲在用戶的瀏覽器作爲cookie,所以當它擊中你的網絡服務器,它可以知道確切的文件讀書。

如果有任何其他網站設置相同的鑰匙$_SESSION變量將是隻爲它的哈希,您的服務器不會讀。

3

你迄今所做的什麼是好的,似乎不容易,也沒有攻擊其他網站不影響你的設置會話變量,但照顧你如何處理會話一旦創建會話。還會在每次登錄時生成隨機會話令牌,並在更改密碼時更改會話令牌。

2

你不太可能,除非有在同一臺服務器上的另一個登錄頁面來面對這個問題。說,管理員和前端用戶的登錄。

如果你想加強您的會話和其他安全組件,你可以參考這個:

PHP Session Security

3

一般來說本身可以被認爲是安全的會話。問題是可以竊取會話,允許黑客完全訪問該會話中的任何內容。

由於PHP存儲會話ID作爲cookie,黑客可以簡單地通過使用XSS竊取該會話。

也許看看這裏瞭解更多信息:​​3210

4

這是正確的。這是大多數使用PHP的網站通常使用的方式。

$_SESSION是一個超級全局變量只能由服務器管理。

會發生什麼:

  1. 你叫session_start()
  2. 將生成一個名爲PHPSESSID(或任何你php.ini命名),以加密安全值的cookie。
  3. PHP聲明瞭一個名爲$_SESSION變量,它在內部存儲與關聯於所生成的Cookie值。

爲什麼它不能被其他網站改變:

  1. $_SESSION值只存儲在內部。即使客戶知道它的價值。它只保存會話ID的Cookie,但它甚至不知道該會話ID的含義,也不知道其他人的會話ID應該是什麼。
  2. 此會話ID Cookie不能被其他網站盜用或修改。默認情況下,cookie路徑設置爲您自己的域,客戶端只應將其發送給您。 (如果客戶要發送到其他網站,它的泄漏了自己的證書,這是沒有你的責任,但客戶端瀏覽器的漏洞)

除非你是在同一臺服務器上運行的其他網站,這韓元不會成爲問題(在正常情況下)。


作爲一個側面說明,請提醒的是,你應該使用header("Location: index.php");後添加return;聲明。這是錯誤的常見來源,在這種情況下,它可能會使服務器面臨危險,因爲即使您的瀏覽器在收到位置標題後不顯示內容,您的服務器實際上仍在發送應該是用戶生成的,如果他已經登錄

TL; DR:如果你有一個腳本,不應該發送任何數據,如果客戶沒有登錄,header("Location: ...");後不添加return;聲明將使服務器仍然發送數據,但正常的瀏覽器不會顯示出來(因爲它重定向),但如果有一個人誰試圖查看發送的數據(使用作爲curl作爲簡單的方法,不添加-L選項)會很容易地看到他們。

+0

是cookie可以被其他網站設置? – NaveenDA

+0

@NaveenDA如果你不想讓它發生,理論上不會。實際上,如果您正確發送cookie(默認操作),則它們甚至不會發送到其他網站。 – SOFe

+1

試想一下,如果每個網站的cookie都被你訪問的每個網站看到,假設你訪問了1000個使用cookies的網站,每次訪問你的網站都會不必要地發送1000個cookies,這是非常不合理的。除非瀏覽器存在漏洞,否則來自不同網站的Cookie不應攔截所有網站。 – SOFe

相關問題