首页  >  文章  >  后端开发  >  为什么我的登录表单无法连接到我的 MySQL 数据库?

为什么我的登录表单无法连接到我的 MySQL 数据库?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-25 11:13:02736浏览

Why is My Login Form Not Connecting to My MySQL Database?

无法将登录表单连接到 MySQL 数据库

此查询涉及实现根据 MySQL 数据库进行验证的用户登录功能。用户期望输入用户名和密码,该用户名和密码应根据数据库中存储的凭据进行验证。不幸的是,虽然表单提交没有错误,但并没有实现想要的功能。

解决问题

这个问题的根本原因在于缺乏针对 SQL 注入攻击的保护以及不安全在数据库中以纯文本形式存储密码。为了解决这些问题,建议:

  • 使用准备好的语句:参数化用户输入以防止 SQL 注入攻击。不是直接将用户输入嵌入到 SQL 查询中,而是使用占位符,并将参数绑定到这些占位符。
  • 实施正确的密码散列:使用单向散列函数安全地存储密码,例如bcrypt 或 PBKDF2。这可以防止未经授权的用户在数据泄露时访问明文密码。

代码解决方案(使用准备好的语句和密码哈希)

Register.php:

<code class="php">// Replace previous code with the following:

session_start();

if (isset($_SESSION['userid'])) {
    // Redirect to safe page
}

if (isset($_POST['register'])) {
    $email = $_POST['email'];
    $password = $_POST['password']; // Cleartext password from user

    // New code for password hashing
    $hashed_password = password_hash($password, PASSWORD_DEFAULT);

    // Database connection and query
    $host = "localhost";
    $dbname = "database_name";
    $user = "username";
    $pass = "password";

    try {
        $conn = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        
        $stmt = $conn->prepare("INSERT INTO user_accounts (email, password) VALUES (?, ?)");
        $stmt->execute([$email, $hashed_password]);
        
        // Redirect to login page
        
        $conn = null;
    } catch (PDOException $e) {
        throw $e;
    }
}</code>

Login.php:

<code class="php">// Replace previous code with the following:

session_start();

if (isset($_SESSION['userid'])) {
    // Redirect to safe page
}

if (isset($_POST['login'])) {
    $email = $_POST['email'];
    $password = $_POST['password']; // Cleartext password from user

    // Database connection and query
    $host = "localhost";
    $dbname = "database_name";
    $user = "username";
    $pass = "password";

    try {
        $conn = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        // Get hashed password from database
        $stmt = $conn->prepare("SELECT password FROM user_accounts WHERE email = ?");
        $stmt->execute([$email]);
        $hashed_db_password = $stmt->fetchColumn();

        if (password_verify($password, $hashed_db_password)) {
            // User authenticated successfully
            $_SESSION['userid'] = true;
            
            // Redirect to safe page
        } else {
            // Authentication failed
        }
        
        $conn = null;
    } catch (PDOException $e) {
        throw $e;
    }
}</code>

通过这些代码修改,用户登录现在应该通过与 MySQL 数据库安全交互来正常运行,从而防止SQL注入攻击和用户密码泄露。

以上是为什么我的登录表单无法连接到我的 MySQL 数据库?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn