在带有php脚本的html表单上进行简单登录过程时遇到一些问题。所以,我创建了注册用户部分,按照预期将用户添加到数据库,所以我知道它存在。
现在问题是尝试登录用户,我使用password_hash();
方法加密密码。我想在我的脚本中如何解密密码?最大的问题是,当我提交表格时,尽管存在争议,但它根本没有给我任何错误。
我有错误报告,没有任何回复,我知道它是在var_dump()
上我做了一个简单的$_POST
,它显示了我预期的结果,这是我的代码:
<?php
session_start();
include('header.php');
var_dump($_POST);
if($_SERVER["REQUEST_METHOD"] == "POST")
{
$username = mysqli_real_escape_string($conn, $_POST['userlogin']);
$password = mysqli_real_escape_string($conn, $_POST['userpassword']);
$sql_query = "SELECT * FROM users WHERE userlogin='$username' and userpassword='$password'";
$result = mysqli_query($conn, $sql_query);
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
$count = mysqli_num_rows($result);
if($count == 1){
$_SESSION['login_user']=$username;
header("location: home.php");
} else {
$error="Username or Password is invalid";
}
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<input type="text" name="userlogin">
<br />
<input type="password" name="userpassword">
<br />
<input type="submit" name="submit" value="submit">
</form>
**更多信息**
的header.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Venture</title>
</head>
<body>
</body>
</html>
<?php include('../db.php'); ?>
<h1>Header</h1>
<hr />
答案 0 :(得分:1)
好的所以我会链接一个代码,我用它来登录我的CP,对你的代码更加纤薄,但几乎没有变化:
编辑:添加此行以验证输入的密码和存储的密码:
$isPasswordCorrect = password_verify($password_user, $password);
这是代码:
<?php
session_start();
$servername = "localhost";
$username = "root";
$password = "your database password";
$database = "your database";
try {
$conn =new PDO("mysql:host=$servername;dbname=$database", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e)
{
echo "Connection failed: " . $e->getMessage();
}
if(isset($_POST['btn-login']))
{
$User_name = $_POST['userlogin'];
$password_user = $_POST['pass'];
$FetchUserData = $conn->prepare("SELECT * FROM users WHERE userlogin = ?");
$FetchUserData->execute(array($User_name));
$FetchedData = $FetchUserData->fetch(PDO::FETCH_ASSOC);
if ($FetchedData)
{
$password = $FetchedData['userpassword']; // Save the fetched password inside variable
$isPasswordCorrect = password_verify($password_user, $password);
if( $password_user == $isPasswordCorrect )
{
$_SESSION['login_user']=$User_name;
header("location: home.php");
}
else
{
echo "Password is wrong":
}
}
else
{
echo "User is not exist ";
}
}
?>
<html>
<body>
<h1>Login</h1>
<form action="test.php" method="post">
<input type="text" name="userlogin">
<br />
<input type="password" name="pass">
<br />
<input type="submit" name="btn-login">
</form>
</body>
</html>
SQL注入是一种代码注入技术,用于攻击 数据驱动的应用程序,其中存在恶意的SQL语句 插入到输入字段中以便执行(例如,转储数据库) 内容给攻击者。)
您可以从此处了解更多相关信息:SQL INJECTION
我对代码做了什么以便可以保护?
我这样做了:
$FetchUserData = $conn->prepare("SELECT * FROM users WHERE userlogin = ?");
$FetchUserData->execute(array($User_name));
尽量不要为您创建的任何查询输入直接参数,使用我向您展示的方式来完成工作。
希望此代码可以帮助您。
答案 1 :(得分:0)
登录用户时,不应该从数据库解密密码并将其与通过POST提供的密码进行匹配。相反,采用POST提供的方式,哈希,就像注册用户时一样,并将该结果与数据库进行比较。
$username = mysqli_real_escape_string($conn, $_POST['userlogin']);
$password = mysqli_real_escape_string($conn, $_POST['userpassword']);
// Make sure to set the value of $hash to the one in the database for the user.
// You can grab your user by the userlogin value
if (password_verify($password , $hash)) {
echo 'Password is valid!';
// continue your user validation
} else {
echo 'Invalid password.';
}