mrkatzzz/sse-webapp
GitHub: mrkatzzz/sse-webapp
一个用于网络安全实验课程的 PHP 最小化身份验证系统,通过模拟撞库攻击场景演示 Bcrypt 哈希、速率限制、账户锁定和 TOTP 双因素认证等多层防御策略。
Stars: 0 | Forks: 0
# 安全身份验证系统 (Bcrypt + TOTP 2FA)
本仓库包含一个基于 PHP 的最小化身份验证系统,是网络安全实验课程的一部分。它演示了多层防御策略,包括安全哈希、自动速率限制和双因素身份验证 (2FA)。
## 🛠 环境搭建 (XAMPP)
本项目设计为在本地 **XAMPP** 服务器上运行。请按照以下步骤部署文件:
1. **本地目录**:在 XAMPP 的 `htdocs` 目录下创建一个名为 `cyber_lab` 的文件夹:
- **Linux**:`/opt/lampp/htdocs/cyber_lab/`
- **Windows**:`C:\xampp\htdocs\cyber_lab\`
2. **文件部署**:将本仓库中的所有 `.php` 文件粘贴到 `cyber_lab` 文件夹中。
3. **服务**:确保通过 XAMPP 控制面板启动了 **Apache** 和 **MySQL** 服务。
4. **访问**:在浏览器中访问 `http://localhost/cyber_lab/register.php` 开始使用。
## 🗄 数据库初始化
在 **phpMyAdmin** (`http://localhost/phpmyadmin`) 中执行以下 SQL 命令以配置后端数据库:
```
-- 1. Initialize Database
CREATE DATABASE lab_assignment;
USE lab_assignment;
-- 2. Create Users Table with Security Columns
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
login_attempts INT DEFAULT 0,
lockout_until DATETIME DEFAULT NULL,
google_2fa_secret VARCHAR(32) DEFAULT NULL
);
-- 3. Alter Table for 2FA Support
ALTER TABLE users ADD COLUMN google_2fa_secret VARCHAR(32) DEFAULT NULL;
```
# 🔐 带有 2FA 的身份验证系统
## 📂 文件结构
| 文件 | 描述 |
| --------------------- | ------------------------------------------------------------------------------------------------------- |
| **db.php** | 建立应用程序全局使用的 MySQLi 连接逻辑。 |
| **authenticator.php** | 核心库,使用共享的 Base32 密钥和当前的 30 秒时间步长计算 TOTP 验证码。 |
| **register.php** | 处理用户创建;使用 `PASSWORD_BCRYPT` 对密码进行哈希处理。 |
| **setup_2fa.php** | 生成唯一的 2FA 密钥,并渲染二维码用于与 Google Authenticator 同步。 |
| **login.php** | 阶段 1 安全机制:验证凭据并管理速率限制逻辑。 |
| **verify_2fa.php** | 阶段 2 安全机制:在授予最终会话访问权限之前,要求输入 6 位 TOTP 验证码。 |
| **welcome.php** | 受限仪表盘,只有在成功完成两个安全阶段后才能访问。 |
| **logout.php** | 销毁用户会话并执行安全清理。 |
## 🛡 安全机制
### **1. 密码哈希**
系统绝不存储明文密码。本系统使用 PHP 的 `password_hash()` 函数结合 **Bcrypt** 算法。
验证过程使用 `password_verify()` 进行,该函数可有效抵御彩虹表攻击。
### **2. 速率限制与账户锁定**
为了缓解**暴力破解**和**撞库**攻击,系统会记录失败的尝试次数。
* 当达到 **3 次失败尝试**后,该账户将被标记。
* 系统会生成一个 `lockout_until` 时间戳,在 **5 分钟** 的时间段内拒绝所有访问尝试。
### **3. TOTP 2FA (双因素身份验证)**
通过实现**基于时间的一次性密码 (TOTP)**,确保仅凭泄露的密码不足以获取账户访问权限。
* **共享密钥**:服务器和用户的移动设备之间共享一个唯一的 Base32 密钥。
* **时间同步**:验证码基于当前的 Unix 时间生成。
### **4. 防重放保护**
每个 TOTP 验证码仅在 **30 秒的时间窗口**内有效。
这可以防止**重放攻击**,即被拦截的验证码被未经授权的方重新使用。
标签:2FA, Bcrypt, ffuf, OPA, OpenVAS, PHP, SQL, TOTP, Web安全, XAMPP, 凭证填充攻击, 双因素认证, 安全实验, 安全设计与实现, 密码哈希, 登录安全, 系统审计, 网络安全, 蓝队分析, 账户锁定机制, 身份验证系统, 隐私保护, 靶场