2011-06-11 171 views
8

我正在開發一個使用Codeigniter的Web應用程序。當用戶使用我的網站進行身份驗證時,我正在將我們的用戶標識符存儲在會話cookie(我已啓用加密)中。我的幾個模型類使用session/cookie的'user-identifier'參數中的值來更改用戶帳戶的屬性。Codeigniter/PHP會話安全問題

我擔心的是,我想知道是否有人可以使用我設置的用戶標識符獲取有效的codeigniter會話cookie,將用戶標識符的值更改爲不同用戶的值,並對其他用戶的帳戶進行更改。如果有人試圖更改會話cookie的屬性,codeigniter/php會話是否會產生錯誤?

回答

19

打開/application/config/config.php,找到「sess_use_database」並將其更改爲「TRUE」(如果還沒有的話)。通過這種方式,所有會話變量都將存儲在數據庫表中,而會話cookie將只包含會話ID字符串。

爲了增加安全性,您還可以將「sess_match_ip」更改爲TRUE。這樣,如果有人竊取用戶的cookie並嘗試將其作爲自己的cookie傳遞,會話將被銷燬。

+3

從最新的CodeIgniter 3.0.1開始,「sess_use_database」名稱已被替換爲「sess_driver」,它可以設置爲「database」。最新的文檔聲稱,默認的'文件'驅動程序是最安全的選擇:http://www.codeigniter.com/user_guide/libraries/sessions.html – 2015-05-21 21:32:51

+0

真棒知道。 – b3tac0d3 2016-01-09 04:34:37

3

我不確定你的「用戶標識符」是什麼。一般規則是,不要在會話cookie中存儲任何內容,但會話ID。在服務器端存儲其他所有內容(如用戶ID),並使用會話ID檢索它。

如果用戶更改了會話ID(這是一個隨機字符串),將開始一個新的會話。會話ID背後的想法是,無法猜測其他用戶的ID - 這就是爲什麼它是隨機的,這麼久。

+0

你碰巧知道codeigniter的會話類是否具有這樣的功能?我同意這是個好主意。例如,如果我這樣做:$ this-> sessions-> set_userdata('id',5);這個值是在cookie中傳遞給用戶還是存儲在服務器上並與會話ID相關聯? – 2011-06-11 16:46:37

+0

@Casey我不熟悉CI,但根據[文檔](http:// codeigniter。com/user_guide/libraries/sessions.html),數據確實存儲在cookie中。他們顯示一個安全的數據庫選項,雖然 – 2011-06-11 16:48:03

+0

我的'用戶標識符'基本上是我的用戶表中每個用戶的主鍵。我在SQL查詢中使用它來修改與每個用戶關聯的屬性。我知道這可能很糟糕。 – 2011-06-11 16:48:33

4

「如果 有可能採取 有效笨,會話cookie 用戶標識符的值更改爲 不同用戶的價值, 更改其他用戶的 帳戶。」

我的答案並不是真正的CI相關,所以請牢記這一點。

當你認證用戶「username1」時,應該發送回客戶端,爲了認證目的,應該是服務器與該用戶關聯的散列。客戶端和服務器之間的所有通信將依賴於該散列。

服務器將爲每個用戶生成一個唯一的哈希,並且哈希應該有一個短暫的生存時間。有人可以捕獲一個散列並通過該用戶?當然。這就是爲什麼您還應該檢查用戶的代理和IP以檢查它們是否與哈希匹配以防止會話劫持。如果看到了一些新的開發存儲在cookie中的用戶名和reliing對客戶端發送的變量來更新他們的數據庫

永遠不要這樣做。永遠不要這樣做。永遠不要信任客戶。當服務器獲取客戶端的哈希時,它應該檢查它是否屬於經過身份驗證的用戶,並從服務器獲取user_id(變量以更新用戶數據)。永遠不要從客戶端。