PHP Cookie Security


PHP Cookie Security

我有这个安全页面。只是想问一下,在我的cookie登录上是否应该有什么我需要担心的。我不使用mysql来保存用户数据,因为只有管理员需要访问页面。你能告诉我我的安全登录页面有什么漏洞吗?黑客如何能够破解这个安全的主页?我还需要做些什么才能让它更安全。非常感谢。

<?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会话登录…这比cookie更安全吗?

<?php
session_start();
if ($_SESSION['logged_in'] == true) {
//++++++++++++++++ secure data start +++++++++++++++++++

//++++++++++++++++ secure data end +++++++++++++++++++
} elseif ($_POST['user'] == 'admin' && $_POST['pass'] == 'H@rDP@s$w0rD98741') {
    $_SESSION['logged_in'] = true;

} else {
    session_destroy();
}

?>

为这个cookie添加盐和创建摘要有什么意义?生成一个随机字符串会更好,对吧?顺便说一句,如果你在网上发送密码,那么安全问题就是大错特错!

如果你正在使用cookie字符串解密并从中找到一些信息,那么加密cookie而不是散列它是一个很好的逻辑。在这种情况下,我个人更喜欢随机字符串。

我看到你接收密码到你的脚本的方式是一个普通的请求参数,这打破了这个脚本的第一环安全,我可以简单地嗅探你的密码从行。使cookie安全并不能解决所有访问安全问题。

如果我说错了,请纠正我:)

谢谢

情人眼里出西施。所有的哈希听起来都很棒,但实际上看起来像是从用户那里获取了一个用户名和一个密码。你要求他们总是使用相同的浏览器(或设备),并且他们永远不会升级他们的系统(对他们来说不安全)。

我心目中的"安全"是SSL/TLS。当用户使用像WireShark这样的应用程序连接时,这将防止(或使它非常困难)有人从网络中捕获usernamepassword。因为它只适用于管理员,所以最好将他们的IP地址列入白名单,并使用您的预共享信息进行身份验证。

而不是允许他们从任何地方访问,让他们使用VPN进入公司网络,如果它在网络上,他们可以访问这个。

我在这里没有看到任何关于跟踪失败登录尝试或其他性质的东西。因此,基本上有人可以运行一个蛮力攻击(或者如果他们知道你的密码习惯字典)的盒子,试图进入。所以你希望运行ip tables之类的东西来防止这种事情。

你也没有检查referrer,所以如果有人想尝试进入,他们可以一直点击处理程序页面自动绕过登录页面。

您还需要记录用于在其他地方(而不是在代码中)创建散列的过程,然后确保您没有以明文形式存储代码中的任何变量。这样,如果有人得到了这个文件,他们就不会一次得到所有的登录。

从更好的安全角度来看,您可以使cookie在不活动后的一定时间内过期。这将迫使用户再次登录,而不是给他们一年的cookie,或者像@ decize建议的那样使用会话(前提是超时是合理的)。

我看到的主要问题是:

  1. cookie泄露信息,即用户id;任何信息泄露都是潜在攻击者的陷阱
  2. cookie本质上是静态的;除非管理员的IP地址改变,否则cookie将始终是相同的
  3. 服务器无法控制用户的登录状态
  4. 代码是复杂的(坦率地说相当糟糕),因此容易出错

特别是第二点和第三点在一起打破了它。如果攻击者成功捕获或找到一个cookie一次,它将永远有效。攻击者可以简单地尝试所有可能的有效cookie,因为cookie本质上是静态的。一旦他发现了秘密握手,它就永远有效,而你不知道它的发生。

您应该使用经过战斗测试的登录方法,而不是自己想出。最简单的是标准运行的磨机会话。cookie将包含一个有时间限制的无意义的blob,服务器知道所有正在运行的会话,并且可以在需要时撤销它们。让这些都在HTTPS上运行,你就会像以前一样安全。