PHP 用户验证代码安全优化:防止 SQL 注入攻击

以下代码展示了如何优化 PHP 用户验证代码,以防止 SQL 注入攻击:

<?php
// 连接数据库
$servername = 'localhost';
$username = 'root';
$password = '123456';
$dbname = 'index';

$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    die('数据库连接失败: ' . $conn->connect_error);
}

// 获取用户输入的用户名和密码
$username = $_POST['username'];
$userPassword = $_POST['password'];

// 查询数据库中的密码
$stmt = $conn->prepare('SELECT password FROM userpass WHERE username = ?');
$stmt->bind_param('s', $username);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
    $row = $result->fetch_assoc();
    $hashedPassword = $row['password'];

    // 验证密码是否匹配
    if (password_verify($userPassword, $hashedPassword)) {
        // 密码正确,可以访问受保护的页面
        // 这里可以执行你想要的逻辑,比如跳转到其他页面
        header('Location: protected_page.php');
        exit();
    } else {
        // 密码错误,显示错误信息或执行其他操作
        // 这里可以执行你想要的逻辑,比如显示错误页面
        header('Location: error_page.php');
        exit();
    }
} else {
    // 用户不存在,显示错误信息或执行其他操作
    // 这里可以执行你想要的逻辑,比如显示错误页面
    header('Location: error_page.php');
    exit();
}

$conn->close();
?>

这个修复主要包括以下几点优化:

  1. 使用预处理语句来防止 SQL 注入攻击,将用户输入的用户名作为参数绑定到查询语句中。
  2. 使用 $stmt->get_result() 方法获取查询结果集,这样可以直接使用 fetch_assoc() 方法获取查询结果,避免了使用 num_rowsfetch() 方法的组合。
  3. 在查询结果为空的情况下,也进行了错误处理,跳转到错误页面。这样可以提供更好的用户体验,避免暴露数据库中是否存在该用户的信息。

通过这些优化,可以有效地提高代码的安全性,并提供更好的用户体验。

PHP 用户验证代码安全优化:防止 SQL 注入攻击

原文地址: https://www.cveoy.top/t/topic/FyC 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录