2013-06-21 126 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运行,并且您的安全性与以往相同。