2013-06-21 123 views
-1

我有這個安全頁面。只是想詢問是否應該有任何我需要擔心的cookie登錄。我不使用mysql來保存用戶數據,因爲只有管理員需要訪問該頁面。你能告訴我我的安全登錄頁面的任何缺陷嗎?黑客如何能夠破解這個主要的安全頁面?我還需要做些什麼才能使它更安全。非常感謝你。PHP Cookie安全

<?php 
$salt = 'a|s534#ihtuQb84z<xIR_ kU;L~?-A?-x|u+Njw##Us(Pi(-hM+YmiQF`Bz[Bl -'; 
$salt2 = ',/Da|H#s7cWINVi&a4wy9Qc&gVrF*o)u(XoidF?-8w=vkzLRLN4U9 #u88T5818E'; 

//checks for post details 
if (isset($_POST['user'], $_POST['pass'])) { 

//santizes the details 
$user = preg_replace('/[^A-Za-z0-9]/','', $_POST['user']); 
$pass = preg_replace('/[^A-Za-z0-9]/','', $_POST['pass']); 

//check if user exists 
    if (($user === 'admin1' && $pass === 'pass1') || 
     ($user === 'admin2' && $pass === 'pass2') || 
     ($user === 'admin3' && $pass === 'pass3')) { 


     //i can make it that the $user will also be hashed just in case i need to 
     $cookiemd5 = $user.'-'.sha1(crypt($pass, $salt).md5($_SERVER["REMOTE_ADDR"].$salt2.$_SERVER["HTTP_USER_AGENT"])); 


      if (intval($_POST['rememberme']) === 1) { 
       setcookie("temp", $cookiemd5, time()+60*60*24*365, "/", ".domain.com", false, true); 
      } else { 
       setcookie("temp", $cookiemd5, false, "/", ".domain.com", false, true); 
      } 

     header("Location: /secure.php"); exit(); 

    } else { 

     header("Location: /secure.php"); exit(); 

    } 

} elseif($_GET['do'] === 'logout') { 

     setcookie("temp", "", time()-2592000, "/", ".domain.com", false, true); 

     header("Location: /secure.php"); exit(); 

} elseif (isset($_COOKIE['temp'])) { 

    $details = explode('-', $_COOKIE['temp']); 


    if (($details[0] == 'admin1' && $details[1] == sha1(crypt('pass1', $salt).md5($_SERVER["REMOTE_ADDR"].$salt2.$_SERVER["HTTP_USER_AGENT"]))) || 
     ($details[0] == 'admin2' && $details[1] == sha1(crypt('pass2', $salt).md5($_SERVER["REMOTE_ADDR"].$salt2.$_SERVER["HTTP_USER_AGENT"]))) || 
     ($details[0] == 'admin3' && $details[1] == sha1(crypt('pass3', $salt).md5($_SERVER["REMOTE_ADDR"].$salt2.$_SERVER["HTTP_USER_AGENT"])))) { 
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
//+++++++++++++++++++++ EVERYTHING STARTS HERE AFTER LOGIN ++++++++++++++++++++++++++++++++++++++ 
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
?> 




<?php 
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
//+++++++++++++++++++++ EVERYTHING ENDSSS HERE AFTER LOGIN ++++++++++++++++++++++++++++++++++++++ 
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
} else { setcookie("temp", "", time()-2592000, "/", ".domain.com", false, true); header("Location: /secure.php"); } 
} else { echo'<form name="login" method="post" action="secure.php"> Username: <input type="text" name="user"><br> Password: <input type="password" name="pass"><br> Remember Me: <input type="checkbox" name="rememberme" value="1"><br> <input type="submit" name="submit" value="Login!"></form>'; } ?> 

編輯.... 你看這個簡單的PHP會話登錄...這是遠比餅乾更安全?

<?php 
session_start(); 

if ($_SESSION['logged_in'] == true) { 
//++++++++++++++++ secure data start +++++++++++++++++++ 



//++++++++++++++++ secure data end +++++++++++++++++++ 
} elseif ($_POST['user'] == 'admin' && $_POST['pass'] == '[email protected]@s$w0rD98741') { 

    $_SESSION['logged_in'] = true; 


} else { 

    session_destroy(); 

} 


?> 
+1

簡單而簡單:爲什麼不進行會話?它們很簡單,並且對服務器控制登錄有效性。 – deceze

+0

AbsoluteƵERØ說得好看。您可能會添加例如睡眠。 4000ms對每個登錄檢查的殘障暴力攻擊 – alex

+0

@alex 4000ms聽起來有點刺耳,我想你的意思是400ms – Oleg

回答

1

安全是在旁觀者的眼中。所有的哈希聲音聽起來都很棒,但實際上它看起來像是從用戶處取得一個用戶名和一個密碼。您要求他們總是使用相同的瀏覽器(或設備),並且他們永遠不會升級他們的系統(對他們來說不安全)。

我心中的「安全」是SSL/TLS。當用戶使用像WireShark這樣的應用程序連接時,這會阻止(或者非常難)讓某人從網絡捕獲usernamepassword。由於它僅適用於管理員,因此最好將他們的IP地址列入白名單,並使用您的預共享信息進行驗證。

而不是讓他們從任何地方訪問,使他們使用VPN到企業網絡,他們可以訪問它,如果它在網上。

我沒有看到任何關於跟蹤失敗的登錄嘗試或任何此類性質的內容。所以基本上有人可以用暴力手段(或者如果他們知道你的密碼習慣字典)攻擊這個盒子,試圖進入。所以你有希望運行諸如ip tables的東西來防止這種事情發生。

而且你不檢查referrer所以有人會不停的按處理程序頁面自動繞過登錄頁面,如果他們想嘗試和得到的。

您還需要記錄你使用的過程在其他地方(不是在代碼中)創建哈希,然後確保您沒有以明文形式存儲代碼中的任何變量。這樣,如果有人抓住這個文件,他們不會立即獲得所有登錄。

從更好的安全角度來看,您可以使cookie在閒置後的一段時間內過期。這將迫使用戶再次登錄,而不是給他們一年的cookie,或者@deceze建議的使用會話(假設超時是合理的)。

1

添加salt併爲此cookie創建摘要有什麼意義?生成一個隨機的字符串會更好嗎?順便說一句,如果你發送的密碼很簡單,那麼安全性問題就是錯誤的!

如果您使用cookie字符串來解密並從中找到一些信息,那麼它是一個很好的加密cookie的邏輯,而不是對它進行散列。在這種情況下,我個人比較喜歡隨機字符串。

我看到你接收到你的腳本密碼的方式是一個普通的請求參數,這打破了這個腳本中的第一個安全環,我可以簡單地從線上嗅出你的密碼。使cookie安全無法解決所有訪問安全問題。

請大家指正,如果我錯了:)

感謝

0

我看到存在的主要問題:

  1. cookie的泄露信息,即用戶ID; 任何信息泄露是一個可能的攻擊者的鉤子
  2. 該cookie基本上是靜態的;除非管理員的IP地址發生變化時,cookie將始終是相同的
  3. 服務器擁有用戶
  4. 代碼是複雜的(坦率地說非常糟糕),因此容易出錯
的登錄狀態沒有控制

特別是第二點和第三點一起打破IMO。如果攻擊者設法捕獲或發現一次cookie,它將永遠有效。攻擊者可以簡單地嘗試所有可能的有效cookie,因爲cookie本質上是靜態的。一旦他找到了祕密握手,它永遠有效,你不知道它正在發生。

你應該使用經過測試的登錄方法,而不是用自己的。最簡單的是會話的標準運行。該cookie將包含一個時間有限的無意義blob,服務器知道所有正在運行的會話,並且可以根據需要撤消它們。讓所有這些都通過HTTPS運行,並且您的安全性與以往相同。