2011-11-04 216 views
1

我有一個方法,我檢查用戶名和密碼(哈希+鹽)是正確的。之後,如果用戶已經進行了我的操作:餅乾系統 - 安全

if(isset($remember) && $remember == '1') { 
     setcookie('email', $email, time()+60*60*24*100); 
    } 
    else { 
     setcookie('email', $email, time()+3600); 
    } 

我的問題是關於安全問題。上面的代碼是不安全的?它需要像簽名一樣的東西?

例如:

$user_email = $email; 
$hash = sha1(rand(0,500).microtime()); 
$signature = sha1($hash . $user_email); 
$cookie = base64_encode($signature . "-" . $hash . "-" . $user_email); 
setcookie('authentication', $cookie); 

你覺得呢?

+1

如何檢查是否有人登錄? – ComFreek

+0

好吧,我只檢查cookie是定義(isset)還是空的 – anvd

+1

哦,這是非常不安全的,因爲在瀏覽器中手動設置cookie非常簡單! – ComFreek

回答

1

軼事時間:早在2002年,我正在查看來自我學校網絡的數據包轉儲,並告訴他們他們需要修正他們的成績,出勤率,學生信息以及所有日光照射系統。他們設置的方式是在用戶通過身份驗證之後,系統會設置一個只包含用戶名和會話結束時間的cookie。我啓動了一個瀏覽器,選擇了一個用戶名(第一個姓,名),並將其設置爲一個cookie。我有權訪問。

他們應該做的事情是設置一個隨機的128號碼並跟蹤服務器(號碼,相應的用戶,超時值)。

3

你需要驗證一個隨機生成的哈希或服務器端的東西。用戶可以根據需要調整數據,併發送任何返回的cookie數據。用你目前的方案,似乎很容易指定他們想要的任何用戶。害怕。

登錄時,將身份驗證密鑰與IP,UserAgent和Expiration一起粘貼到數據庫中。如果他們嘗試使用您的站點並且IP或UserAgent不同,或者密鑰已過期,請強制註銷。

0

爲了便於防止用戶更改cookie的值,您可以使用網上找到的this class。它將編寫一個包含與所有cookie值的「總和」對應的哈希的cookie,因此如果更改數據,哈希將不正確。

只需要三個方法: Cookie::set(cookie_name, value)Cookie::get(cookie_name)Cookie::reset()