2011-11-29 75 views
3

我使用$ _SESSION ['name']來處理頁面間的數據。我主要用它來保持用戶在頁面之間登錄。在每一頁中,我檢查$ _SESSION [logged_in']是否爲真。如果爲true,請保持用戶登錄。否則,請執行其他操作。這是會話變量的安全使用嗎?

這是我如何處理我的課程 - 基本樣本:

<?php 

session_start(); 

if($_SESSION['logged_in']) 
{ 
    //show control panel list 
} 
else 
{ 
    //show login box. Once user logs in. Once user logs in, 
    //fetch userID, username, etc from database. Also set 
    //$_SESSION['logged_in'] = true. 
} 

?> 

某處代碼之間我做了以下內容:

SELECT * FROM User WHERE userID = $_SESSION['userID']; 

我不知道,如果$ _SESSION [ '用戶ID' ]可以由用戶訪問或不訪問。如果它是可訪問的,那麼該頁面將受到威脅,因爲用戶可以手動更改用戶ID並訪問他/她所希望的其他帳戶。

我沒有太多的安全。請指教!我能做什麼?

注:我試圖使代碼儘可能簡單。目前,沒有涉及到OOP。

+0

用戶可以操縱他們的cookies,而不是他們的會話數據,無論如何這就是簡短的答案......我認爲你做得很好。 Maby會評估是否應將未登錄的用戶踢出到單獨的登錄頁面並退出,以避免該腳本繼續運行。 – Teson

+0

長答案:只給你的用戶一個session_id,它通過一個cookie傳遞或者獲得變量。這個標識符允許PHP查找該用戶的會話,該會話存儲在您的服務器上(默認情況下,在一個文件中)。 PHP讀取會話數據並使用數據填充$ _SESSION超級全局。用戶不能直接訪問會話數據,因此將敏感數據存儲在這裏很好。 –

+0

[PHP會話變量安全性如何?](http://stackoverflow.com/questions/1181105/how-safe-are-php-session-variables) –

回答

1

這是相當不錯的,這裏有一些其他技巧會話管理:

  1. 不要接受來自GET/POST變量的會話標識符:在URL 會話標識符(查詢字符串,GET變量)或POST變量不推薦,因爲它簡化了這種攻擊。在設置GET/POST變量的表單上建立鏈接很容易。

  2. 在每個請求上重新生成SID: 在PHP中使用session_regenerate_id()。每次用戶的訪問級別發生變化時,都需要重新生成會話標識符。這意味着雖然攻擊者可能欺騙用戶接受已知的SID,但當攻擊者試圖重新使用SID時,SID將無效。

2

$ _SESSION是服務器端Super Globals之一。它不能被用戶訪問或以任何方式從您的服務器傳輸。

1

是的,這是非常正確的想法。

這裏有一些資源,可以幫助,無論是在一般理解會話安全和安全編程:

http://phpsec.org/projects/guide/4.html http://phpsec.org/projects/guide/

3

您的代碼容易受到會話固定和會話劫持攻擊。有關更多信息,請參閱http://phpsec.org/projects/guide/4.html

當您構建更大,更多涉及的應用程序時,您還需要小心如何處理將用戶登出並處理其他會話相關方面(如特權升級)的方式。處理會話和登錄安全是一個棘手的野獸。

實施安全認證非常困難。除非你是做學術練習,否則我會強烈建議使用你的框架提供的庫,如果你有足夠的幸運有一個好的。

你也將要考慮的東西,如以下:

  • 不允許被強迫的會話ID。 [會話固定]
  • 當權限或憑證發生更改(例如,因爲用戶已登錄或註銷),則 立即使會話無效並啓動一個新會話。
  • 提供註銷功能,並確保在註銷時使會話無效。
  • 將會話cookie設置爲HttpOnly - 優選地,需要HTTPS並且將cookie設置爲僅安全。
  • 考慮限制會話有效性,以包括檢查有助於與用戶匹配的一些其他信息,例如,用戶代理。 [會話劫持]
  • 在未使用之後,請務必過期會話,並且不要通過將用戶重新連接到其舊會話來實現「保持登錄狀態」。
  • 確保會話無效時所有與會話相關的數據都被銷燬,而不管它在哪裏存儲。一位新來的用戶可能剛好被分配了以前使用過的會話ID。此新會話不得訪問之前根據會話標識設置的會話數據。