本文示範一個基於 PHP 與 MySQL 的基本使用者認證系統,包含註冊、登入、Session/Cookie 狀態維持三大核心功能。適合初學者理解 Web 認證基本原理。
CREATE DATABASE userinfo;
USE userinfo;
CREATE TABLE usertbl (
ID INT AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(30) NOT NULL UNIQUE,
Password VARCHAR(20) NOT NULL,
LastLogin DATETIME
);
<?php
// login.php
$conn = mysqli_connect("localhost", "user", "password", "userinfo")
or die("無法連接資料庫");
$name = mysqli_real_escape_string($conn, $_POST['name']);
$pass = mysqli_real_escape_string($conn, $_POST['password']);
$sql = "SELECT id FROM usertbl WHERE Name='$name' AND Password='$pass'";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) == 0) {
echo "非法使用者,請先註冊";
} else {
$row = mysqli_fetch_assoc($result);
$id = $row['id'];
// 更新最後登入時間
mysqli_query($conn, "UPDATE usertbl SET LastLogin=NOW() WHERE id=$id");
// 建立 Session
session_start();
$_SESSION['user_id'] = $id;
$_SESSION['username'] = $name;
echo "登入成功,歡迎 $name!";
}
?>
<?php
// register.php
$conn = mysqli_connect("localhost", "user", "password", "userinfo")
or die("無法連接資料庫");
$name = mysqli_real_escape_string($conn, $_POST['name']);
$pass = mysqli_real_escape_string($conn, $_POST['password']);
// 檢查帳號是否存在
$check = mysqli_query($conn, "SELECT id FROM usertbl WHERE Name='$name'");
if (mysqli_num_rows($check) > 0) {
echo "帳號已存在,請換個名稱";
} else {
// 密碼加密儲存(生產環境請用 password_hash)
$hash = password_hash($pass, PASSWORD_DEFAULT);
$sql = "INSERT INTO usertbl (Name, Password) VALUES ('$name', '$hash')";
mysqli_query($conn, $sql);
echo "註冊成功,請登入!";
}
?>
<?php
// auth_check.php - 放在每個需登入頁面頂端
session_start();
if (!isset($_SESSION['user_id'])) {
header("Location: login.php");
exit;
}
// 可取得 $_SESSION['username'] 顯示歡迎訊息
?>
| 風險 | 對策 |
|---|---|
| SQL 注入 | 使用預備語句或 mysqli_real_escape_string |
| 明文密碼 | 使用 password_hash() / password_verify() |
| Session 劫持 | 啟用 session.cookie_httponly、session.use_strict_mode、HTTPS |
| 暴力破解 | 登入失敗計數、驗證碼、帳號鎖定機制 |
| CSRF | 表單加入 CSRF Token 驗證 |
這個簡易系統展示了認證核心邏輯,實際專案中請務必套用上述安全強化措施,並考慮使用成熟框架(如 Laravel、Symfony)內建的認證元件。