2011-11-14 62 views
1

我已經建立了一個提供一些基本的「我可以這樣做嗎?」的類。我的網站的授權功能,比如「這個用戶可以查看這個資源嗎?」或「該用戶是否可以添加圖片?」存儲授權對象到會話?

因此類對象實例化在不少頁面(可能,每一頁都具有用戶交互)使用$authorize = new myAuthorizationClass();

然後myAuthorizationClass類中查找用戶的ID,並檢查他們的訪問級別。

然後我可以這樣說

if ($authorize->canAddImage()){ 
    // do image add stuff 
} 

是否有可能的,安全的和「最佳實踐」這個$authorize對象存儲到會話中?有沒有另外一種方法來避免在每個頁面上構建這個認證對象,並進行數據庫交互等?

我不認爲它可以這麼簡單,只是說「將用戶的權限級別設置爲A,B或C,並在他們的會話中設置!」因爲他們對特定資源的訪問取決於誰擁有資源,用戶在站點中扮演什麼角色等等,我們必須根據訪問的資源類型來檢查一些不同的事情。

由於

+0

IIRC,在會話中存儲授權信息被認爲是不好的做法,特別是在基於cookie的會話中,因爲cookie可能會非常容易地在不安全的wifi等設備上被竊取。 –

+0

@ truth - 謝謝,我認爲你是對的,但是這會存儲一個對象,然後執行身份驗證操作作爲函數。不確定這是否可能!但是,想要與專家權衡。 – julio

回答

0

會話(未cookie中)內存儲用戶數據是可以接受的,因爲這數據被存儲在服務器端,並隨機爲每個用戶產生,並且只要你的會話處理存儲被保護,將其他用戶無法訪問。

如果您想通過無需查找每個頁面請求的用戶角色/訪問來減少數據庫負載,您可能需要考慮在成功登錄時拉取信息,然後將(以序列化格式)存儲到會話變量。然後,對於受保護的資源,您可以反序列化存儲在變量中的數據,進行檢查並相應地執行。

+0

此外,你可以存儲一些會話對象。正確使用__sleep()和__wake()方法,不要忘記在session_start()之前包含類定義(不需要使用外部加載)。 – Oroboros102

+0

這不是事實。服務器如何將您標識爲該會話的所有者?它會向您發送一個會話ID,通常以Cookie的形式發送,並且該Cookie用於通過服務器進行身份驗證以向您顯示數據。但是,如果該cookie被盜,該怎麼辦?服務器會將攻擊者誤認爲是您的,並且您的所有授權數據都將在他手中。 –

+0

@Truth:根據PHP的說法,您是正確的:「這可以存儲在用戶端的Cookie中,也可以在URL中傳播。」但是我說過「用戶數據」,在會話中存儲是很好的。 –

0

我認爲這被認爲是不好練習存儲授權會話中的數據。

原因很簡單,雖然數據本身存儲在服務器端,在安全的地方,較弱的鏈接實際上仍然(像往常一樣)在客戶端。
服務器必須以某種方式識別擁有數據的客戶端,通常以發送給用戶的session_id cookie的形式完成。該Cookie將在每個請求中發送到服務器,服務器將能夠通過(非常隨機的)ID來確定您是誰。

但是,在不安全的WiFi(或計算機)上,攻擊者可能很容易竊取該cookie,這將導致服務器將他識別爲您。


有沒有簡單的解決方法,除了SSL和用戶培訓。如果您的站點需要非常高的安全性(例如金錢交易或關鍵數據庫操作),請告知用戶並提醒他們確認當地的安全措施。此外,如果您的網站處理關鍵數據庫操作,請勿允許從Web應用程序完成任何關鍵操作(刪除,表格刪除等)。只能通過root用戶。