2010-05-27 48 views
5

在我的PHP Web-App中,我使用會話來存儲用戶的數據。例如,如果用戶登錄,則會生成一個User類的實例並存儲在Session中。客戶端/用戶可以修改會話嗎?

我有訪問級別與每個用戶相關聯,以確定他們的權限。

商店用戶在會話由:

$_SESSION['currentUser'] = new User($_POST['username']); 

例如:

if($_SESSION['currentUser'] -> getAccessLevel() == 1) 
{ 
    //allow administration functions 
} 

其中getAccessLevel()是簡單地在用戶類返回_accesslevel成員變量get方法。

這種產品是否安全?或者,客戶端是否可以通過某種類型的會話操作修改其訪問級別?

回答

2

不,客戶端無法修改其訪問級別。存儲在客戶端上的唯一東西是通過cookie或GET參數傳播的會話密鑰。會話密鑰綁定到相應的會話記錄,該記錄是存儲在服務器端(通常在臨時目錄中)的文件,該文件包含'punch'。 你不想要的,是一個會話密鑰來獲得泄露給第三方:

一份被泄露的會話ID使第三 黨訪問其 與特定ID相關聯的所有資源。

看看這個:http://www.php.net/manual/en/session.security.php

+0

怎麼會泄漏,假設我沒有通過SESSION_ID在查詢字符串或通過郵局(除非它是自動發生芹苴我不知道這樣的事情),並假設他們沒有到訪問服務器? – Sev 2010-05-28 00:03:32

+0

@Sev - 您的網絡流量可以被嗅探。 Cookies /獲取參數/除非您使用SSL,否則所有內容均爲純文本且易於提取。 – karim79 2010-05-28 00:07:14

+0

你是對的,謝謝。 – Sev 2010-05-28 00:09:06

1

會話信息存儲在服務器上,用戶只能訪問一個關鍵。在實踐中,我使用了這種類型的東西,並採取了額外的步驟。驗證用戶詳細信息並存儲用戶對象後,我將在查看任何受保護頁面時運行查詢,以驗證會話中的內容與他們正在查看的內容是否正常無關。 在您的page.php文件

if(!validUser($user)){ 
    // Relocate the user 
} 

的頂部,其中

validUser(User $user) 
{ 
    // Some query to verify the information in the session 
    // Return the results of verification 
} 
+0

基本上你說的是查詢數據庫並確保數據與會話數據相匹配?好吧,爲了做到這一點,我需要通過$ _POST查詢存儲在會話中的用戶名,如果他們已經修改了他們的會話,他們也可能修改了他們的用戶名。 – Sev 2010-05-28 00:00:18

+0

您可以通過在用戶登錄時在用戶對象中存儲一次salt或會話標識來防止此問題。用戶或logged_in_user表中的列可以存儲它。這樣當User-> name和User-> salt與數據庫中的內容不匹配時,它們就會失效。 – ashurexm 2010-05-28 00:05:15

+0

優秀。謝謝。 – Sev 2010-05-28 00:09:35

0

我想了用戶操作這樣的事情是,如果它被保存在用戶的計算機上的cookie的唯一途徑。

是對getaccesslevel存儲到一個cookie或者從服務器檢查登錄cookie,而不是存儲在用戶的計算機上後只能叫什麼名字?

我會假設,如果它被稱爲然後在用戶登錄後才能在服務器上,他們將不能夠輕易操縱的是,除了通過安全漏洞等手段。

只是我的猜測,我自己還沒有那麼好,安全。我會密切關注這一點,看看別人有什麼要說的,也許我可以學到一些東西。