在实际应用中,为了保护用户密码的安全,确实应该使用哈希算法对密码进行存储,而不是明文。下面的示例将展示如何在PHP中使用用户名和密码登录网站,其中密码经过哈希处理,并且数据库为Microsoft SQL Server (MSSQL)。
步骤 1: 数据库连接 (保持不变)
这里我们仍然使用之前定义的connectDB
函数来建立与MSSQL的连接。
步骤 2: 用户注册时密码哈希处理
首先,确保在用户注册时,其密码被哈希处理后存储到数据库。这里使用PHP内置的password_hash
函数:
Php
1function registerUser($username, $passwordPlain) {
2 $conn = connectDB();
3
4 // 对密码进行哈希处理
5 $passwordHash = password_hash($passwordPlain, PASSWORD_DEFAULT);
6
7 // 预处理语句,防止SQL注入
8 $stmt = $conn->prepare("INSERT INTO Users (Username, PasswordHash) VALUES (?, ?)");
9 $stmt->bindParam(1, $username);
10 $stmt->bindParam(2, $passwordHash);
11 $stmt->execute();
12
13 // 关闭数据库连接
14 $conn = null;
15}
步骤 3: 用户登录验证,使用哈希对比
修改之前的登录函数,以使用password_verify
函数来验证哈希后的密码:
Php
1function login($username, $passwordPlain) {
2 $conn = connectDB();
3
4 // 预处理语句获取密码哈希
5 $stmt = $conn->prepare("SELECT PasswordHash FROM Users WHERE Username=?");
6 $stmt->bindParam(1, $username);
7 $stmt->execute();
8 $row = $stmt->fetch(PDO::FETCH_ASSOC);
9
10 // 关闭数据库连接
11 $conn = null;
12
13 // 验证密码
14 if ($row && password_verify($passwordPlain, $row['PasswordHash'])) {
15 return true;
16 } else {
17 return false;
18 }
19}
使用示例
与之前相同,调用login
函数来验证用户登录:
Php
1<?php
2session_start();
3
4$username = $_POST['username'];
5$password = $_POST['password'];
6
7if(login($username, $password)) {
8 $_SESSION['loggedin'] = true;
9 $_SESSION['username'] = $username;
10 echo "Login successful!";
11} else {
12 echo "Invalid username or password.";
13}
14?>
这个示例展示了如何在用户注册时使用password_hash
函数对密码进行哈希处理,并在用户登录时使用password_verify
函数来验证密码,从而提高密码存储的安全性。记得在实际部署时,确保所有的表单提交都通过HTTPS进行,以增加数据传输的安全性。