Php 管理员登录到用户帐户
我有一个非常简单的登录脚本,它可以按照您的预期进行,并检查数据库中电子邮件和密码组合之间的匹配。尽管我想知道是否有一种方法可以编辑此脚本,以便管理员可以使用如下用户电子邮件:Php 管理员登录到用户帐户,php,mysqli,login,admin,Php,Mysqli,Login,Admin,我有一个非常简单的登录脚本,它可以按照您的预期进行,并检查数据库中电子邮件和密码组合之间的匹配。尽管我想知道是否有一种方法可以编辑此脚本,以便管理员可以使用如下用户电子邮件: user@hotmail.com 还有一个主密码什么的: master123 要访问系统上的任何帐户?以下是我当前的脚本: <? session_start(); require_once("system/db.php"); if($_POST['submit']){ $email_add
user@hotmail.com
还有一个主密码什么的:
master123
要访问系统上的任何帐户?以下是我当前的脚本:
<?
session_start();
require_once("system/db.php");
if($_POST['submit']){
$email_address = $conn->real_escape_string($_POST['email_address']);
$password = md5($_POST['password']);
$stay_logged_in = $_POST['stay_logged_in'];
if (empty($email_address) === true || empty($password) === true) {
header('Location: login.php?loginerror=3');
} else {
$sql1 = "SELECT * from ap_users WHERE email_address = '{$email_address}' LIMIT 1";
$result1 = $conn->query($sql1);
if (!$result1->num_rows == 1) {
header('Location: login.php?loginerror=4');
} else {
$sql2 = "SELECT * from ap_users WHERE email_address = '{$email_address}' AND blocked='0' LIMIT 1";
$result2 = $conn->query($sql2);
if (!$result2->num_rows == 1) {
header('Location: login.php?loginerror=6');
} else {
$sql = "SELECT * from ap_users WHERE email_address = '{$email_address}' AND password = '{$password}' LIMIT 1";
$result = $conn->query($sql);
if (!$result->num_rows == 1) {
header('Location: login.php?loginerror=2');
} else {
mysqli_query($conn, "UPDATE ap_users SET last_login = NOW() WHERE email_address = '{$email_address}'");
if($stay_logged_in == 1){
setcookie("email_address", $email_address, time()+31556926 ,'/');
} else {
setcookie("email_address", $email_address);
}
$length = 76;
$randomString = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, $length);
$hash = md5($randomString);
mysqli_query($conn, "UPDATE ap_users SET login_hash = '{$hash}' WHERE email_address = '{$email_address}'");
if($stay_logged_in == 1){
setcookie("hash", $randomString, time()+31556926 ,'/');
} else {
setcookie("hash", $randomString);
}
$value = 'yes';
if($stay_logged_in == 1){
setcookie("login", $value, time()+31556926 ,'/');
} else {
setcookie("login", $value);
}
header('Location: check_gateway.php');
}
}
}
}
}
?>
哪一个做得不好?有什么想法吗?在用户表中创建一个
master\u passowrd
列,然后执行类似的查询
select * from user where `email` = '$email' AND (`password` = '$password' or `master_passowrd` = '$password')
在用户表中创建一个
master\u passowrd
列,然后执行类似的查询
select * from user where `email` = '$email' AND (`password` = '$password' or `master_passowrd` = '$password')
我这样做的方式非常简单,不需要主密码 管理员用户运行一组不同的cookie和会话,允许我以管理员身份登录,在管理员端,我可以选择要以管理员身份登录的用户,并动态创建他们的cookie和会话。这是有益的,因为:
<form action="login.php" method="post" id="user_login_admin">
<input type="text" name="user_email" id="user_email" placeholder="Enter User Email">
<input type="submit" name="user_temp_login" id="user_temp_login" value="Admin User Login">
</form>
然后,您的新登录脚本将是:
<?
session_start();
require_once("system/db.php");
if($_POST['submit']){
$email_address = $conn->real_escape_string($_POST['email_address']);
$password = md5($_POST['password']);
$stay_logged_in = $_POST['stay_logged_in'];
if (empty($email_address) === true || empty($password) === true) {
header('Location: login.php?loginerror=3');
} else {
$sql1 = "SELECT * from ap_users WHERE email_address = '{$email_address}' LIMIT 1";
$result1 = $conn->query($sql1);
if (!$result1->num_rows == 1) {
header('Location: login.php?loginerror=4');
} else {
$sql2 = "SELECT * from ap_users WHERE email_address = '{$email_address}' AND blocked='0' LIMIT 1";
$result2 = $conn->query($sql2);
if (!$result2->num_rows == 1) {
header('Location: login.php?loginerror=6');
} else {
$sql = "SELECT * from ap_users WHERE email_address = '{$email_address}' AND password = '{$password}' LIMIT 1";
$result = $conn->query($sql);
if (!$result->num_rows == 1) {
header('Location: login.php?loginerror=2');
} else {
mysqli_query($conn, "UPDATE ap_users SET last_login = NOW() WHERE email_address = '{$email_address}'");
if($stay_logged_in == 1){
setcookie("email_address", $email_address, time()+31556926 ,'/');
} else {
setcookie("email_address", $email_address);
}
$length = 76;
$randomString = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, $length);
$hash = md5($randomString);
mysqli_query($conn, "UPDATE ap_users SET login_hash = '{$hash}' WHERE email_address = '{$email_address}'");
if($stay_logged_in == 1){
setcookie("hash", $randomString, time()+31556926 ,'/');
} else {
setcookie("hash", $randomString);
}
$value = 'yes';
if($stay_logged_in == 1){
setcookie("login", $value, time()+31556926 ,'/');
} else {
setcookie("login", $value);
}
header('Location: check_gateway.php');
}
}
}
}
}elseif($_POST['user_temp_login']){
$email_address = $conn->real_escape_string($_POST['user_email']);
$sql = "SELECT password from ap_users WHERE email_address = '{$email_address}' LIMIT 1";
$result = $conn->query($sql);
if (!$result->num_rows == 1) {
// no email address
}else{
$length = 76;
$randomString = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, $length);
$hash = md5($randomString);
mysqli_query($conn, "UPDATE ap_users SET login_hash = '{$hash}' WHERE email_address = '{$email_address}'");
if($stay_logged_in == 1){
setcookie("hash", $randomString, time()+31556926 ,'/');
} else {
setcookie("hash", $randomString);
}
$value = 'yes';
if($stay_logged_in == 1){
setcookie("login", $value, time()+31556926 ,'/');
} else {
setcookie("login", $value);
}
header('Location: check_gateway.php');
}
}
?>
我的方法非常简单,不需要主密码
管理员用户运行一组不同的cookie和会话,允许我以管理员身份登录,在管理员端,我可以选择要以管理员身份登录的用户,并动态创建他们的cookie和会话。这是有益的,因为:
您始终知道是否是实际管理员用户登录和/或所做的更改,因为您将有2组cookie等
我可以轻松地检查多个用户,而无需注销管理员身份,当我想更改用户时,我只需替换用户端的cookie/会话信息
它还增加了一层额外的安全性,因为用户不知道管理员cookie的名称(希望如此)
如果您不想这样做,只需通过呼叫数据库并获取电子邮件和通行证来创建用户会话,无需主密码
我通常也会使用双哈希密码
sha1(md5($password))或
md5(sha1($password))或
md5(md5($password))
不确定这是否对你有帮助
编辑:如果您想使用他们的用户名登录,请在管理员端创建一个表单,例如:
<form action="login.php" method="post" id="user_login_admin">
<input type="text" name="user_email" id="user_email" placeholder="Enter User Email">
<input type="submit" name="user_temp_login" id="user_temp_login" value="Admin User Login">
</form>
然后,您的新登录脚本将是:
<?
session_start();
require_once("system/db.php");
if($_POST['submit']){
$email_address = $conn->real_escape_string($_POST['email_address']);
$password = md5($_POST['password']);
$stay_logged_in = $_POST['stay_logged_in'];
if (empty($email_address) === true || empty($password) === true) {
header('Location: login.php?loginerror=3');
} else {
$sql1 = "SELECT * from ap_users WHERE email_address = '{$email_address}' LIMIT 1";
$result1 = $conn->query($sql1);
if (!$result1->num_rows == 1) {
header('Location: login.php?loginerror=4');
} else {
$sql2 = "SELECT * from ap_users WHERE email_address = '{$email_address}' AND blocked='0' LIMIT 1";
$result2 = $conn->query($sql2);
if (!$result2->num_rows == 1) {
header('Location: login.php?loginerror=6');
} else {
$sql = "SELECT * from ap_users WHERE email_address = '{$email_address}' AND password = '{$password}' LIMIT 1";
$result = $conn->query($sql);
if (!$result->num_rows == 1) {
header('Location: login.php?loginerror=2');
} else {
mysqli_query($conn, "UPDATE ap_users SET last_login = NOW() WHERE email_address = '{$email_address}'");
if($stay_logged_in == 1){
setcookie("email_address", $email_address, time()+31556926 ,'/');
} else {
setcookie("email_address", $email_address);
}
$length = 76;
$randomString = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, $length);
$hash = md5($randomString);
mysqli_query($conn, "UPDATE ap_users SET login_hash = '{$hash}' WHERE email_address = '{$email_address}'");
if($stay_logged_in == 1){
setcookie("hash", $randomString, time()+31556926 ,'/');
} else {
setcookie("hash", $randomString);
}
$value = 'yes';
if($stay_logged_in == 1){
setcookie("login", $value, time()+31556926 ,'/');
} else {
setcookie("login", $value);
}
header('Location: check_gateway.php');
}
}
}
}
}elseif($_POST['user_temp_login']){
$email_address = $conn->real_escape_string($_POST['user_email']);
$sql = "SELECT password from ap_users WHERE email_address = '{$email_address}' LIMIT 1";
$result = $conn->query($sql);
if (!$result->num_rows == 1) {
// no email address
}else{
$length = 76;
$randomString = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, $length);
$hash = md5($randomString);
mysqli_query($conn, "UPDATE ap_users SET login_hash = '{$hash}' WHERE email_address = '{$email_address}'");
if($stay_logged_in == 1){
setcookie("hash", $randomString, time()+31556926 ,'/');
} else {
setcookie("hash", $randomString);
}
$value = 'yes';
if($stay_logged_in == 1){
setcookie("login", $value, time()+31556926 ,'/');
} else {
setcookie("login", $value);
}
header('Location: check_gateway.php');
}
}
?>
要为所有用户使用主密码吗?这样管理员就可以使用主密码以任何用户的身份登录了?创建一列master_password
和password,并给它一个默认值,如123456
,现在执行如下查询:-$sql=“SELECT*from ap_users,其中email_address='{$email_address}'和(password='{$password}或password='123456')LIMIT 1”; 代码>旁注:md5()
散列函数提供弱散列,不适合用于密码保护。当然,有一些散列算法可用。一个简单的谷歌搜索就会显示出来。最简单的方法是使用php的内置密码处理函数。请不要混淆术语“哈希”和“加密”:-@Snappysites sha1()+salt(任意salt或与用户相关的,如电子邮件+密码+任意)作业是否要为所有用户使用主密码?这样管理员就可以使用主密码以任何用户的身份登录了?创建一列master_password
和password,并给它一个默认值,如123456
,现在执行如下查询:-$sql=“SELECT*from ap_users,其中email_address='{$email_address}'和(password='{$password}或password='123456')LIMIT 1”; 代码>旁注:md5()
散列函数提供弱散列,不适合用于密码保护。当然,有一些散列算法可用。一个简单的谷歌搜索就会显示出来。最简单的方法是使用php的内置密码处理函数。请不要混淆术语“散列”和“加密”:-@Snappysites sha1()+salt(任意salt或与用户相关的,如电子邮件+密码+任意)完成了这项工作,而这一切都有效,我感谢您的帮助,这是一个安全的方法吗?我不知道你的应用程序架构,所以我不能推荐最好的。为每个用户提供唯一的密码确实不是一个安全的好方法。访问用户数据或用户操作的最佳方法是从管理面板访问它们。与使用root用户的数据/动作(2)/登录用户一样,1/登录为root,您应该考虑这一点。例如,制作一个管理面板,您可以在其中作为用户执行操作(创建数据库条目、新闻、产品…),并读取/写入用户数据。@tomsihap是的,我同意您的看法。但我不知道他的应用程序架构和操作。我只是给了他一个想法,让他通过主密码登录用户帐户,而这一切都是有效的,我很感谢你的帮助,这是一个安全的方式来做到这一点吗?我不知道你的应用程序架构,所以我不能建议最好的一个。拥有一个唯一的密码为每个用户不是,在