登录表单不会出现任何错误而不会处理脚本

时间:2016-09-07 18:49:21

标签: php mysqli

在带有php脚本的html表单上进行简单登录过程时遇到一些问题。所以,我创建了注册用户部分,按照预期将用户添加到数据库,所以我知道它存在。

enter image description here

现在问题是尝试登录用户,我使用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 />

2 个答案:

答案 0 :(得分:1)

好的所以我会链接一个代码,我用它来登录我的CP,对你的代码更加纤薄,但几乎没有变化:

  • 使用PDO执行查询并从数据库中获取用户名和密码。
  • 从SQL注入中防止了我的代码。怎么样 ?我将在代码中解释。

编辑:添加此行以验证输入的密码和存储的密码:

$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>
  • 正如你所看到的,我使用了PDO来执行和从数据库中获取数据,一个简单的查询就像你的代码中的一个可以完成这项任务,但它有危险,它可以被打破,所以它不会被阻止黑客入侵,有些人可以使用SQL注入。什么是SQL注入?
  

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.';
    }