首页  >  文章  >  后端开发  >  **为什么我的 MySQL 登录脚本不起作用?**

**为什么我的 MySQL 登录脚本不起作用?**

Susan Sarandon
Susan Sarandon原创
2024-10-26 07:15:02953浏览

**Why is my MySQL login script not working?**

我的登录脚本中的 MySQL 连接有什么问题?

在提供的代码片段中,似乎有几个区域可能会导致登录表单出现问题。让我们一一浏览一下:

1。数据库连接:

在 PHP 文件 login.php 中,您尝试使用以下代码建立与数据库的连接:

<code class="php">// Pretend the following is locked in a vault and loaded but hard coded here
$hostname = "localhost";
$database = "boost";
$username = "root";
$password = "";
$localhost = mysqli_connect($hostname, $username, $password, $database);

if (mysqli_connect_errno()) {
    die("Connection Failed" . mysqli_error());
}</code>

但是,您已硬编码数据库凭据。在代码中硬编码这些细节并不是一个好的做法,因为它们将来可能会发生变化。相反,建议在配置文件中分离数据库凭据并从那里读取它们,以确保更好的安全性和灵活性。

2.准备好的语句:

在register.php和login.php中,您使用mysqli_prepare函数准备SQL语句。但是,您之后不会使用 mysqli_stmt_execute 执行它们。这将阻止执行查询并导致登录或注册失败。

3.绑定参数:

使用 mysqli_stmt_bind_param 函数时,应提供绑定参数的类型。在register.php和login.php中,您都使用“s”类型(用于字符串)绑定参数。但是,如果您要绑定整数值,则应使用适当的类型说明符,例如表示整数的“i”。

4.用户身份验证:

在login.php中,验证用户密码时,您将明文密码($ctPassword)直接与存储在数据库中的散列密码($dbHashedPassword)进行比较。这是一个安全风险,因为攻击者可以拦截请求,从而获得对用户密码的访问权限。相反,您应该使用password_verify 函数来安全地比较散列密码。

5.会话处理:

您使用 $_SESSION 超全局变量来存储成功登录后的用户 ID。但是,您不使用login.php 中的session_start() 来启动会话。这将导致会话无法正确初始化,并且会话数据将不可用。

6. SQL 注入:

执行 SQL 查询时没有使用准备好的语句,这使您的代码容易受到 SQL 注入攻击。您应该始终使用准备好的语句来防止此类攻击。

以下是一些解决这些问题的更新代码片段:

register.php:

<code class="php">session_start();

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

    // Pretend the following is locked in a vault and loaded but hard coded here
    $host = "yourhostname";
    $dbname = "dbname";
    $user = "dbuser";
    $pwd = "password";
    $port = 3306; // Comes along for the ride so I don't need to look up param order below

    try {
        $mysqli = new mysqli($host, $user, $pwd, $dbname, $port);

        if ($mysqli->connect_error) {
            die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
        }

        $query = "INSERT INTO user_accounts2(email, password) VALUES (?, ?)";
        $stmt = $mysqli->prepare($query);

        $hp = password_hash($ctPassword, PASSWORD_DEFAULT); // Hashed password using cleartext one

        $stmt->bind_param("ss", $email, $hp);
        $stmt->execute();

        $iLastInsertId = $mysqli->insert_id;
        $stmt->close();
        $mysqli->close();
    } catch (mysqli_sql_exception $e) {
        throw $e;
    }
}</code>

login.php:

<code class="php">session_start();

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

    // Pretend the following is locked in a vault and loaded but hard coded here
    $host = "yourhostname";
    $dbname = "dbname";
    $user = "dbuser";
    $pwd = "password";
    $port = 3306;

    try {
        $mysqli = new mysqli($host, $user, $pwd, $dbname, $port);

        if ($mysqli->connect_error) {
            die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
        }

        $query = "SELECT id, email, password FROM user_accounts2 WHERE email = ?";
        $stmt = $mysqli->prepare($query);

        $stmt->bind_param("s", $email);
        $stmt->execute();

        $result = $stmt->get_result();

        if ($row = $result->fetch_array(MYSQLI_ASSOC)) {
            $dbHashedPassword = $row['password'];
            if (password_verify($ctPassword, $dbHashedPassword)) {
                echo "Right, userId=";
                $_SESSION['userid'] = $row['id'];
                echo $_SESSION['userid'];
            } else {
                echo "Wrong";
            }
        } else {
            echo 'No such record';
        }

        $stmt->close();
        $mysqli->close();
    } catch (mysqli_sql_exception $e) {
        throw $e;
    }
}</code>

附加说明:

  • 强烈建议使用 PDO 或 Doctrine 等数据库抽象层 (DAL) 来简化数据库交互。
  • 切勿在数据库中以明文形式存储密码。始终使用 bcrypt 或 Argon2 等强大的哈希算法对它们进行安全哈希处理。
  • 使用准备好的语句来防止 SQL 注入攻击。
  • 在将用户输入提交到数据库之前验证用户输入以防止恶意攻击。
  • 考虑使用更强大的安全框架来保护您的应用程序免受各种类型的攻击。

以上是**为什么我的 MySQL 登录脚本不起作用?**的详细内容。更多信息请关注PHP中文网其他相关文章!

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