PHP 用户验证代码安全优化:防止 SQL 注入攻击
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();
?>
这个修复主要包括以下几点优化:
- 使用预处理语句来防止 SQL 注入攻击,将用户输入的用户名作为参数绑定到查询语句中。
- 使用
$stmt->get_result()方法获取查询结果集,这样可以直接使用fetch_assoc()方法获取查询结果,避免了使用num_rows和fetch()方法的组合。 - 在查询结果为空的情况下,也进行了错误处理,跳转到错误页面。这样可以提供更好的用户体验,避免暴露数据库中是否存在该用户的信息。
通过这些优化,可以有效地提高代码的安全性,并提供更好的用户体验。
原文地址: https://www.cveoy.top/t/topic/FyC 著作权归作者所有。请勿转载和采集!