PHP PDO会话将我重定向到登录页面
我正在努力提高我的PHP技能。我来自PHP程序,使用PDO转向PHP,这将使我的web应用程序更加安全,以防止SQL注入或XSS攻击。我创建了一个工作正常的登录表单,用户可以输入电子邮件或用户名,然后输入密码以验证后端是否加密。我在注册表中使用密码\u hash()进行加密 下面是我登录PHP中验证用户身份的代码PHP PDO会话将我重定向到登录页面,php,mysql,session,pdo,Php,Mysql,Session,Pdo,我正在努力提高我的PHP技能。我来自PHP程序,使用PDO转向PHP,这将使我的web应用程序更加安全,以防止SQL注入或XSS攻击。我创建了一个工作正常的登录表单,用户可以输入电子邮件或用户名,然后输入密码以验证后端是否加密。我在注册表中使用密码\u hash()进行加密 下面是我登录PHP中验证用户身份的代码 <?php session_start(); $host = "localhost"; $username = "root"; $password = "
<?php
session_start();
$host = "localhost";
$username = "root";
$password = "";
$database = "test";
$message = "";
try
{
$connect = new PDO("mysql:host=$host; dbname=$database", $username, $password);
$connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if(isset($_POST["login"]))
{
if(empty($_POST["username"]) || empty($_POST["password"]))
{
$message = '
<script>
sweetAlert("Incorrect username or password!", "Please try again.", "error");
</script>;
';
}
else
{
// User login authentication
$query = "SELECT * FROM users WHERE user_type = :user_type AND (username = :username OR email = :username) LIMIT 1";
$statement = $connect->prepare($query);
$statement->execute(
array(
'username' => $_POST["username"],
'email' => $_POST["username"],
'user_type' => 'user'
// 'archive' => 1
)
);
$count = $statement->rowCount();
// Administrator login authentication
$query2 = "SELECT * FROM users WHERE user_type = :user_type AND (username = :username OR email = :username) LIMIT 1";
$statement2 = $connect->prepare($query2);
$statement2->execute(
array(
'username' => $_POST["username"],
'email' => $_POST["username"],
'user_type' => 'admin'
// 'archive' => 1
)
);
$count2 = $statement2->rowCount();
if($count > 0)
{
$result = $statement->fetch();
//check password
if (password_verify($_POST["password"], $result['password'])) {
$_SESSION["login_user"] = $_POST["username"];
exit(header("location:user/dashboard.php"));
} else {
$message = '
<script>
sweetAlert("Incorrect username or password!", "Please try again.", "error");
</script>;
';
}
}
else if($count2 > 0)
{
$result2 = $statement2->fetch();
//check password
if (password_verify($_POST["password"], $result2['password'])) {
$_SESSION["login_admin"] = $_POST["username"];
exit(header("location:admin/dashboard.php"));
} else {
$message = '
<script>
sweetAlert("Incorrect username or password!", "Please try again.", "error");
</script>;
';
}
}
else
{
$message = '
<script>
sweetAlert("Incorrect username or password!", "Please try again.", "error");
</script>;
';
}
}
}
}
catch(PDOException $error)
{
$message = $error->getMessage();
}
?>
我注意到您在SQL字符串中使用了“:user_check”作为参数,但在execute()函数的数组中使用了“:usercheck”作为索引。您需要在sql字符串和execute函数中的数组索引中使用相同的参数名。我注意到您在sql字符串中使用了“:user\u check”作为参数,但在数组的execute()函数中使用“:usercheck”作为索引。您需要在sql字符串和execute函数中的数组索引中使用相同的参数名。您可以尝试提高技能,但请记住,只有当且仅当您使用带有占位符值的准备好的语句,或者当您不能这样做时,对转义非常警惕时,PDO才能保护您免受SQL注入攻击。它不能保护您免受XSS或CSRF攻击,这些是与数据库无关的单独问题。请记住,编写自己的访问控制层并不容易,而且有很多机会会出现严重错误,因此,除非这纯粹是出于学术原因,当任何现代的同类产品都带有强大的内置功能时,不要编写自己的身份验证系统。你可能认为你做得对,但如果你去现场,你可能会发现你错过了什么。谢谢你的提示@tadman我已经开始学习Laravel,并研究了MVC架构和OOP的概念。然而,我想从我现在正在做的过程、OOP和PDO中掌握PHP的基础知识。谢谢你,顺便说一句!我会注意到这一点。别忘了,你可以在框架的上下文中学习基础知识,你可以深入研究代码,看看它是如何实现的,或者编写你自己的低级代码。最后,Laravel仍然是PHP,要有效地使用它,您需要了解PHP核心API。非常感谢!您可以尝试提高自己的技能,但请记住,只有在您使用带有占位符值的准备好的语句,或者在无法做到这一点的情况下,非常警惕地逃避事情时,PDO才能保护您免受SQL注入攻击。它不能保护您免受XSS或CSRF攻击,这些是与数据库无关的单独问题。请记住,编写自己的访问控制层并不容易,而且有很多机会会出现严重错误,因此,除非这纯粹是出于学术原因,当任何现代的同类产品都带有强大的内置功能时,不要编写自己的身份验证系统。你可能认为你做得对,但如果你去现场,你可能会发现你错过了什么。谢谢你的提示@tadman我已经开始学习Laravel,并研究了MVC架构和OOP的概念。然而,我想从我现在正在做的过程、OOP和PDO中掌握PHP的基础知识。谢谢你,顺便说一句!我会注意到这一点。别忘了,你可以在框架的上下文中学习基础知识,你可以深入研究代码,看看它是如何实现的,或者编写你自己的低级代码。最后,Laravel仍然是PHP,要有效地使用它,您需要了解PHP核心API。非常感谢!等等,等我回家后再试试,我会告诉你的。没想到会发生这样的事,它起作用了。我只是懒洋洋地看着我的代码,哈哈。顺便说一句,谢谢你的帮助!等等,等我回家后再试试,我会告诉你的。没想到会发生这样的事,它起作用了。我只是懒洋洋地看着我的代码,哈哈。顺便说一句,谢谢你的帮助!
<?php
$dbhost = "localhost";
$dbname = "test";
$dbuser = "root";
$dbpass = "";
$conn = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
session_start();
$user_check=$_SESSION['login_user'];
$result = $conn->prepare("SELECT * FROM users WHERE email = :user_check OR username = :user_check");
$result->execute(array(":usercheck"=>$user_check));
$row = $result->fetch(PDO::FETCH_ASSOC);
$login_session = $row['username'];
$ln_session = $row['last_name'];
$fn_session = $row['first_name'];
$user_id =$row['id'];
// $user_passwords = $row['password'];
if(!isset($login_session))
{
$conn = null;
header('Location: ../index.php');
}
?>