2
$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也应该进行消毒以防止恶意行为?

4

3 回答 3

2

我认为您误解了登录的概念以及之后会发生什么。

在您的代码中,他们如何首先获取 cookie,以便您可以登录?这是相反的方式。

您首先通过获取他们选择的用户名和密码并将其保存到数据库来注册某人。稍后,为了让他们登录,他们使用登录表单,您输入他们输入的用户名和密码,并验证它与存储在数据库中的用户名和密码是否匹配。到目前为止,没有使用会话或 cookie。

因此,如果用户名和密码在数据库中匹配,则他们已确认凭据(请注意,在这种情况下,您将需要唯一的用户名,否则,无论多么不可能,如果两个人拥有相同的用户名/密码,他们都会访问第一个帐户D b)

现在,如果您想在整个站点中检查他们是否登录(当然),您需要在验证他们的凭据正确时设置一个会话。这将存储一些关于他们的数据,您可以在每个页面上检查并验证他们是否已登录。这可以是他们的用户名,无论如何。

您可以在这里进行任何长度,并检查他们在每个页面上的 IP 是否仍然匹配等。会话很难被破解,并且很可能如果有人在服务器上破解了会话,他们无论如何都可以访问所有其他方式(它是安全的使用会话)。

默认情况下,在大多数服务器上,会话实际上也会使用 cookie,它是存储在服务器上的会话的会话 ID。因此,当您获取用户的会话数据时,它会从该用户获取 cookie 的 ID 并访问存储在服务器上的相关信息。

不要在会话/cookie 中存储敏感信息。

为了存储他们的密码,您想使用 crypt(不是 md5 或 sha)并使用盐渍方法,例如河豚。

于 2013-08-31T00:16:12.370 回答
1

您可以在自己的机器上操作 cookie。更好的方法是为登录用户分配一个随机令牌,您可以将其与数据库交叉引用以拉取用户的级别。

在查询中使用输入之前,您应该始终对其进行清理。

因此,为登录创建一个表并生成一个随机字符串以用作访问令牌。查看php crypt函数以帮助生成字符串并将该令牌和该令牌单独存储在 cookie 中。您可以仅将用户 ID 和令牌存储在登录表中,然后加入用户表以从那里获取级别。

您可以选择循环使用每个页面的令牌,或者增加其他人猜测令牌并劫持管理会话的可能性。

为了提高其安全性,您可以存储时间戳并在特定时间范围后使令牌无效。

于 2013-08-31T00:06:56.273 回答
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
}
于 2013-08-31T00:08:04.243 回答