我有这个安全页面。只是想问一下我的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>'; } ?>
EDIT .... 这个简单的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();
}
?>
答案 0 :(得分:1)
安全是旁观者的眼睛。所有的哈希听起来都很棒,但实际上看起来你正在从用户那里获取一个用户名和一个密码。你要求他们总是使用相同的浏览器(或设备),并且他们从不升级他们的系统(对他们不安全)。
我认为“安全”是SSL/TLS
。当用户使用像WireShark这样的应用程序进行连接时,这会阻止(或使其真的很难)从网络捕获username
和password
。由于它仅适用于管理员,因此最好将其IP地址列入白名单,并使用预共享信息对其进行身份验证。
不要让他们从任何地方访问,而是让他们使用VPN
进入公司网络,如果它在网络上,他们可以访问它。
我在这里看不到有关跟踪失败的登录尝试或任何此类性质的内容。因此,基本上有人可以运行蛮力(或者如果他们知道你的密码习惯是字典)攻击盒子试图进入。所以你希望运行类似ip tables
的东西以防止这类事情。 / p>
此外,您还没有检查referrer
,因此如果有人想尝试进入,有人可以自动绕过登录页面。
您还需要记录您用于在其他地方(而不是代码中)创建哈希的过程,然后确保您没有以明文形式存储代码中的任何变量。这样,如果有人得到这个文件,他们就不会立刻获得所有登录信息。
从更好的安全角度来看,您可以在不活动后的一段时间内使Cookie过期。这会强制用户再次登录,而不是给他们一年的cookie,或者@deceze建议使用会话(假设超时是合理的)。
答案 1 :(得分:1)
添加salt并为此Cookie创建摘要有什么意义?生成一个随机字符串会更好吗?顺便说一句,如果你在线上发送密码,那么安全问题就是错误!
如果您正在使用cookie字符串进行解密并从中查找某些信息,那么它是一个很好的逻辑来加密cookie,而不是哈希它。在这种情况下,我个人更喜欢随机字符串。
我看到你收到脚本密码的方式是一个普通的请求参数,这打破了这个脚本中的第一个安全环,我可以简单地从线上嗅探你的密码。使cookie安全无法解决所有访问安全问题。
如果我错了,请纠正我:)
由于
答案 2 :(得分:0)
我看到的主要问题是:
特别是第二点和第三点一起打破IMO。如果攻击者设法捕获或找到一次cookie,它将永远有效。攻击者可以简单地尝试所有可能的有效cookie,因为cookie基本上是静态的。一旦他找到秘密握手,它就永远有效,你不知道它正在发生。
你应该使用经过战斗测试的登录方法,而不是想出自己的方法。最简单的是磨机会话的标准运行。 cookie将包含一个有时间限制的无意义blob,服务器知道所有正在运行的会话,并在需要时可以撤销它们。让这一切都通过HTTPS运行,你就像以前一样安全。