我对客户的网站进行了以下管理员登录,我只是想问一下这种方法是否安全,我使用了 userID cookie 检查以及数据库中的“管理员是否在线”条目,我也检查了该条目安全原因。
抱歉,如果我的格式不好,我会接受任何提示,请耐心等待,我是一个刚刚进入“客户的第一个项目”阶段的新手程序员。
<?php
include_once('config.php');
if(isset($_POST['usr']) && isset($_POST['pwd'])){
$usr=$_POST['usr'];
$pwd=md5($_POST['pwd']);
$userquery="SELECT * FROM nexus_administrators WHERE user='".$usr."';";
$execuser=mysqli_query($con,$userquery);
$usrnum= mysqli_num_rows($execuser);
$pwdquery="SELECT * FROM nexus_administrators WHERE pwd='".$pwd."';";
$execpwd=mysqli_query($con,$pwdquery);
$pwdnum= mysqli_num_rows($execpwd);
$query="SELECT adminid FROM nexus_administrators WHERE pwd='".$pwd."' AND user='".$usr."';";
$result=mysqli_query($con,$query);
$row=mysqli_fetch_array($result);
$uid= $row['adminid'];
echo $uid;
if($usrnum==1 && $pwdnum==1){
setcookie("uid", $uid, time()+3600*1000);
$puthimonline= "UPDATE nexus_administrators SET isOn=1 WHERE adminid='".$uid."';";
mysqli_query($con,$puthimonline);
header('Location: adminpanel.php');
}
}
//Ai n-ai cookie dai la poarta
if (!isset($_COOKIE['uid'])){
echo " INTRUS !!!!";
echo " </br> Zbori sau o s**i pe ciuperca";
}else{
//te verific si-n baza
$query= "SELECT * FROM nexus_administrators WHERE adminid='".$_COOKIE['uid']."' AND isOn=1;";
$result=mysqli_query($con,$query);
if(mysqli_num_rows($result)!= 1){
header('Location: index.php');
}else{
if(isset($_GET['log'])){
$puthimoffline= "UPDATE nexus_administrators SET isOn=0 WHERE adminid='".$_COOKIE['uid']."';";
mysqli_query($con,$puthimoffline);
header('Location: index.php');
}
echo "hello my dear admin";
echo"
<a href='adminpanel.php?log=0'> Log Out</a>";
};
}
?>
最佳答案
不,这是有缺陷的。有几个问题。
- 计算具有相同密码的用户数量是没有意义的(第二个查询)
- md5 哈希值不足以存储密码。如果攻击者能够访问数据库,他就可以轻松找到密码。你必须使用盐。
- 在数据库中保存 isonline 没有任何意义。如果用户不注销,访问权限将永远保留在数据库中。
- 您将用户 ID 保存在 cookie 中。它不安全,因为它很容易被欺骗。
- 最后但并非最不重要的一点是,您的代码对于 SQL 注入(inject)是开放的(一次来自查询字符串变量,两次来自 cookie)。
关于php - 这种登录方式安全吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25127277/