人们可以通过在地址栏中输入URL来访问管理面板页面

时间:2016-04-28 00:49:43

标签: php mysql

我有一个登录页面和一个永不显示的检查页面。以及用户的面板页面。用户插入他的用户名和密码,然后他进入面板页面。我设置了一个会话,拒绝人们访问面板页面,在地址栏中键入URL,但它不起作用。

<?php
$a="select * from users where username='".$_POST["user"]."' && password='".$_POST["pass"]."'";
$b=mysqli_query($conn,$a);
$c=mysqli_num_rows($b);
if(isset($_POST["btn"])) {
if ($user == "" || $pass == "")
{
    header("location:index.php?empty=1010");
    exit;
}

if ($c > 0)
{
    header("location:welcome.php");
    $_SESSION["x"]=1;
    exit;
}
else
{
    header("location:index.php?error=2020");
    exit;
}
}
?>

,面板页面为:

<?php
session_start();
if(!isset($_SESSION["x"]))
{
    header("location:index.php");
    exit;
}
?>
wellcome

我的错在哪里? 谢谢你的帮助

1 个答案:

答案 0 :(得分:1)

这不是一个访问控制功能,这是黑客的梦想。任何人都可以anything they want to your server使用此代码,因为您获取$_POST数据并将其直接放入查询中,创建SQL injection bug

首先要解决的问题是。好消息是,因为您使用mysqli,您只需调整查询以使用预备语句并使用bind_param安全地添加数据。它只是额外的两行代码,它会产生重大影响。

要解决的第二件事是您将密码存储为纯文本。这是一个巨大的问题。如果您的数据库泄露,考虑到上述SQL注入漏洞,这将是微不足道的,每个人的个人数据都将受到损害。至少使用适当的password hashing,例如PHP中的password_hash函数。

第三件事是登录页面绝对没有任何内容,除非需要限制的每个其他页面都验证您已登录。这非常容易忘记,这样的单据可能意味着管理功能对任何可以猜到URL的用户。这发生在WordPress一次,这是灾难性的。

强烈建议您完全放弃此代码,忘记您曾写过它,而是查看各种development frameworks。有一些是非常安全的,已经实现了所有这些。例如Laravel&#39; authentication system非常好,并且除了已经过测试和安全之外还提供了很多好处。它可能具有需要花费数周时间才能完成的功能,甚至假设您拥有解决它们所需的知识和时间。

框架使得添加Google,Twitter或Facebook登录等内容变得非常容易,因为您可以添加预先编写的模块。它们还为您提供了坚实的基础,以及如何实现功能和组织代码的许多示例,使您的应用程序具有更高的质量,并且可以在将来和其他人中更易于维护。