2010-11-16 91 views
2

我有一個小的web應用程序,它使用了大量的ajax。有人登錄後,我們需要保持持久性的是他們的user_id和group_idCookie + db token +會話身份驗證,我可以不使用會話嗎

我首先進行身份驗證的方式,我只是將它們存儲爲cookie中的明確txt($ _COOKIE ['user_id'],$ _COOKIE ['group_id '])。顯然這是不好的,因爲你可以修改兩個值!

我不是一個有經驗的程序員,也不需要這個應用程序的大量驚人的安全。但那很糟糕。

因此,我開始在數據庫中創建一個令牌,該令牌存儲user_id,group_id和哈希令牌,然後僅將該令牌放入Cookie中。一旦令牌被認證(cookie匹配數據庫),user_id和group_id被創建爲會話。

這是更安全的,但是不得不管理user_id和group_id會話(超時,重新初始化)而僅僅從cookie中抓取它們的事情已經引起了很多的悲傷,並使我的應用程序的實際功能變得不可靠。

現在接受我的技能水平,並且我的應用程序的簡單管理+強大功能比高級別安全性更重要......我想知道是否可以取消會話並通過做出妥協仍然存儲在cookie中,而是沿着與散列的USER_ID和組ID - 即

COOKIE [ '標記'] = user_id_val + group_id_val + hash_in_db

將如下所示:23-144-jhwr8324398fjk2j49083223n23

所以我只需要一個小函數來解析這個字符串,並從中做一切事情。有人可以改變值,但顯然哈希不匹配。

可以嗎?

+0

作爲替代方案,請閱讀每個腳本頂部的cookie值,並且每次都將新用戶標識和組標識拉出。這樣,只要cookie存在,你的會話就不會超時。 – 2010-11-16 21:10:24

+0

你仍然需要維護一個有效的令牌列表,否則有人可能會開始在其中放置不同的ID,並且你可以全部使用:'22_345_fasfsdfdfklsdflk' ...當然,哈希可能不匹配,但是有彩虹表和強力,找出你使用的任何靜態鹽不會太難。再次提醒我使用常規會話的問題是什麼(基於PHP的會話)? – ircmaxell 2010-11-16 21:21:04

+0

對於這個應用程序,'記住我'的行爲是默認的,因爲它通常保持在後臺打開。所以一個cookie是必要的。所以爲了簡單起見,如果我可以從cookie中做到這一切,那就更好了。此外,目前,我正嘗試在cookie上進行身份驗證,並在每個腳本的頂部重新創建會話(如果需要的話),但它看起來有點不自然。對不起,我不能更確切。我意識到,適當的會話管理會很好,但只要沒有不安全感,我堅持使用僅限cookie的路由似乎更容易。 – orchid 2010-11-16 21:32:21

回答

2

您根本不需要cookie(當然,除了session cookie)進行身份驗證。這裏有一個簡單的cookie的身份驗證的一個例子:

session_start(); 

// $db is a pseudo object for database access 

// Verify login 
$auth = false; 
if (isset($_SESSION['user_id']) && isset($_SESSION['user_hash'])) { 
    $user = $db->getUserById($_SESSION['user_id']); 
    if ($user) { 
     $hash = sha1($user->id.$user->salt); 
     if ($hash === $_SESSION['user_hash']) $auth = true; 
    } 
} 

// Make login 
if (isset($_POST['login'])) { 
    $user = $db->getUserByCredentials($_POST['login'], $_POST['password']); 
    if ($user) { 
     $_SESSION['user_id'] = $user->id; 
     $_SESSION['user_hash'] = sha1($user->id.$user->salt); 
     // redirect... 
    } 
    // redirect to error page 
} 

當然,這可以提高增加防禦機制,對各種攻擊,存儲用戶信息等,但是這是基本的想法。這比使用cookie更安全。

相關問題