0

我有一个漫画网站,我想轻松地将图像路径上传到数据库。

我有一个登录屏幕,用于检查正确的凭据:

            <?php 

        $username = isset($_POST['username']) ? $_POST['username'] : "";
        $password = isset($_POST['pw']) ? $_POST['pw'] : "";


        if($_SERVER['REQUEST_METHOD'] == 'POST') {
            if(verify($username, $password) == 1) {
                header("Location: ?action=admin");
            }
            else {
                echo "<center>Incorrect credentials</center>";
            }
        }

        function verify($user, $pw) {
            include './scripts/dbconnect.php';

            $result = $mysqli->query("SELECT username, password FROM users WHERE username='" . $user . "' AND password='" . $pw . "'"); 

            return $result->num_rows;
        }

        include 'include/footer.php';
        ?>

然后将它们登录到上传屏幕。

不幸的是,用户所要做的就是猜测我上传页面的 url 可能是什么,他们可以跳过我的登录屏幕......

/HTwS/?action=login (只需将 'login' 替换为 'admin' 就可以了……)所以,我的第一道防线是不要让我的上传页面名称如此明显……但是会发生什么如果用户仍然猜到...我可以用另一种方式验证,不会让他们只更改网址吗?

谢谢!

4

2 回答 2

1

好吧,这很不安全。您要做的是在登录时设置一些会话变量($_SESSION[user_id],$_SESSION[permission_type]等...)。然后,您可以verifyAdmin()在每个管理页面的顶部使用一个功能,通过检查$_SESSION您刚刚设置的变量来检查登录用户是否实际上是管理员。如果不是,他们将被重定向到登录页面。

当管理员登录时,设置一些会话变量,如下所示:

$_SESSION[user_id] = id_of_admin;
$_SESSION[permission_type] = 'admin';

verifyAdmin 看起来像这样:

function verifyAdmin() {
   if(!isset($_SESSION[username]) || !isset($_SESSION[permission_type]) || $_SESSION[permission_type] != 'admin'){
        header("Location: login.php");
    }
}

然后在每个管理页面的顶部,您可以简单地执行以下操作:

verifyAdmin();

您的验证功能应如下所示:

function verify($user, $pw) {
    include './scripts/dbconnect.php';
    $result = $mysqli -> query("SELECT username, password FROM users WHERE username='" . $user . "' AND password='" . $pw . "'");
    if ($result -> num_rows == 1) {
        $_SESSION[username] = $user;
        $_SESSION[permission_type] = 'admin';
    }
    return $result -> num_rows;
}
于 2013-01-13T21:40:48.603 回答
0

这段代码也容易受到 SQL 注入的影响。您需要清理这些 $_POST 变量。

于 2013-01-13T22:14:11.757 回答