$user = $_COOKIE["username"];
$admin = $db->query("
SELECT *
FROM users
WHERE username = '$user'
AND admin = '1' -- if 1, user is an administrator
");
if ($admin->rowCount()==1) {
//stuff related to admin controls/admin specific pages
}
验证用户是管理员的安全性如何?最终用户是否可以编辑他们的cookie信息,如果他们知道管理员的名字,他们可以以某种方式获得访问权限?如果是这种情况,是否还应对$user
进行清理以防止恶意行为?
答案 0 :(得分:2)
我认为你误解了登录的概念以及之后发生的事情。
在您的代码中,他们如何首先获取cookie以便您可以登录?反过来了。
您首先通过选择用户名和密码并将其保存到数据库来注册某人。稍后,要将它们登录,它们使用登录表单,您可以获取输入的用户名和密码,并验证它是否与数据库中存储的用户名和密码相匹配。到目前为止没有使用会话或cookie。
因此,如果用户名和密码在数据库中匹配,那么他们已经确认了凭据(请注意,在这种情况下,您将需要唯一的用户名,否则,如果两个人拥有相同的用户名/密码,他们都将访问第一个数据库中的帐号
现在,如果您想在整个站点中检查他们是否已登录(当然),您需要在验证其凭据是否正常时设置会话。这将存储一些关于它们的数据,您可以在每个页面上检查并验证它们是否已登录。这可以是它们的用户名,无论如何。
你可以在这里找到任何长度,并检查他们的IP在每个页面上的匹配等等。很难破解,并且如果有人在服务器上攻击会话,他们可以访问各种其他方面(使用会话是安全的。
默认情况下,大多数服务器上的会话实际上也会使用cookie,它是存储在服务器上的会话的会话ID。因此,当您获得用户的会话数据时,它会从该用户的疮cookie中获取ID并访问存储在服务器上的相关信息。
不要在会话/ cookie中存储敏感信息。
要存储密码,您需要使用crypt(不是md5或sha)并使用salting方法,例如blowfish。
答案 1 :(得分:1)
您可以在自己的计算机上操作Cookie。更好的方法是为登录用户分配一个随机令牌,您可以与数据库交叉引用以提取用户的级别。
在查询中使用输入之前,您应始终清理输入。
因此,为登录创建一个表并生成一个随机字符串以用作访问令牌。 查看php crypt函数以帮助生成字符串并将该令牌和该令牌单独存储在cookie中。您只能将用户ID和令牌存储在登录表中,然后与用户表连接以从那里获取级别。
您可以选择循环每页使用的令牌或其他内容,以增加其他人猜测令牌和劫持管理员会话的不可能性。
为了提高安全性,您可以存储时间戳并在特定时间段后使令牌无效。
答案 2 :(得分:0)
绝对零安全!永远不要使用上面描述的方法。
相反,请考虑使用会话
的以下替代方案session_start();
// Set this when the user logs in.
// Then it can be read on subsequent requests and the data stored
// on the server and never accepted from the client.
$_SESSION["username"] = "Bob";
$user = $_SESSION["username"];
$admin = $db->query("
SELECT *
FROM users
WHERE username = '$user'
AND admin = '1' -- if 1, user is an administrator
");
if ($admin->rowCount()==1) {
//stuff related to admin controls/admin specific pages
}