2011-10-17 129 views
0

可能重複:
PHP Session Fixation/HijackingPHP會話劫持

我一直在使用超全局$_SESSION很多和重。

然而,情況是這樣的:

一旦用戶登錄我要跟蹤他的ID(MySQL表)的。我可以很容易地插入 的ID爲$_SESSION['id'] = $user_id;

畢竟我可以使用跨頁變量在我的網站。我的想法是 - 用戶可以將ID欺騙到另一個。如果我看到有一個簡單的數字,那麼我可以稍微改變一下,看看會發生什麼 - 我想要防止這種情況,因爲它可能會導致很多問題,因爲用戶ID將用於添加,刪除,編輯數據庫中的條目。

難道session_regenerate_id()恰好足以讓我的會話免於劫持?

結論: 的Cookie只存儲會話識別器 - 所有值都在服務器上,永遠不會傳遞到客戶端。 Read about session fixation/hijacking on StackOverflow

+0

是什麼讓你認爲存儲在'$ _SESSION'中的變量被髮送到客戶端? –

+0

什麼都沒有。我相信在cookie中的客戶端只有某種類型的哈希與$ _SESSION合作。 我可能寫錯了我的問題 - 我會更新。 –

回答

1

該用戶沒有acccess到$_SESSION['id']。他無法修改服務器上保存的變量(請參閱session doc)。

session_regenerate_id()有不同的目的。它重置cookie SID。這是區分用戶和會話的手段。只有在您有輔助標識符(IP或用戶代理字符串)進行驗證時才使用它。它的主要目的是防止陳舊或相交的會話。再次看到手冊。

+0

對不起。我知道$ _SESSION是在服務器端,但會話在客戶端使用cookie - 不知何故數據需要從瀏覽器傳遞到服務器進行會話。我認爲這被稱爲會話劫持? –

+0

只有SID cookie被瀏覽器傳遞。包含的[[「id」]'變量保存在服務器上。 – mario

+1

請閱讀[PHP會話固定/劫持](http://stackoverflow.com/questions/5081025/php-session-fixation-hijacking) – mario

1

如果我是你,我會在你的數據庫中有一個存儲user_id和session_hash的表。可能還有一個date_expires。然後,當用戶登錄時,根據其id和可能的隨機salt創建散列,將其存儲在數據庫以及會話變量中。這樣,如果他們改變了他們的價值,那麼他們在數據庫中匹配其他存儲值的機會是不太可能的。除此之外,如果用戶在他們的賬戶上執行任何操作,您只需檢查數據庫表的哈希以獲得他們的真實身份,然後像通常那樣執行操作。

1

一個選項是散列它,然後在數據庫中使用相同的散列。

實施例:

$_SESSION['id'] = md5($user_id); 

$query = "SELECT * from database_table where md5(database_table.user_id) = " . $_SESSION['id']; 
+0

加密!=散列 –

+0

謝謝!我以前正在使用這種方法..但現在我想知道它的缺點。 –

+0

@KendallHopkins哎呀這是真的 – Atticus