danialnur/SECR4483-secure-programming-project
GitHub: danialnur/SECR4483-secure-programming-project
一个用于教学对照的 PHP/MySQL Web 应用项目,同时提供包含常见漏洞和对应安全修复的两个版本。
Stars: 0 | Forks: 0
# SECR4483 安全编程 — 安全应用开发项目
**课程:** SECR4483/SCSR4483 安全编程,马来西亚理工大学
**作者:** Danial Nur Irfan bin Azeze (A22EC0046), Muhammad Nabil Iman bin Mohd Fazli (A22EC0087)
## 概述
本仓库包含同一个轻量级 PHP/MySQL 登录 + 交易 Web 应用的两个版本:
- **`vulnerable_app_source/`** — 一个刻意包含漏洞的版本,用于分析和记录常见的 Web 漏洞(SQL injection、XSS、session fixation、IDOR、信任客户端的定价等)。
- **`secure_app_source/`** — 一个重构版本,修复了易受攻击版本中发现的每一个问题,引入了输入验证、prepared statements、RBAC、CSRF 防护、加密存储、安全的 session/cookie 处理以及增强的 HTTP 安全 headers。
## 结构
```
vulnerable_app_source/vulnerable/ Intentionally insecure app (login, register, transaction, config, schema)
secure_app_source/secure/ Remediated app
includes/db.php DB connection, session hardening, encryption helpers, audit logging
includes/auth.php Login/role guards, input validation
includes/csrf.php CSRF token generation/verification
login.php / register.php Authentication
dashboard.php Landing page, role-aware navigation
transaction.php Transaction history + checkout (server-priced, encrypted card-last-4 demo)
admin.php Admin-only user list + audit log (RBAC)
logout.php Full session teardown
.htaccess HTTPS redirect + security headers
schema.sql Database schema
```
## 已识别并修复的漏洞
| 漏洞 | vulnerable/ | secure/ |
|---|---|---|
| SQL injection | 字符串拼接的 queries | 全面使用 `mysqli` prepared statements |
| 明文密码 | 直接按原样存储 | `password_hash()` (bcrypt) / `password_verify()` |
| 反射型/存储型 XSS | 未转义的输出 | 对所有渲染的用户输入使用 `htmlspecialchars()` |
| Session fixation | 不重新生成 ID | 登录时使用 `session_regenerate_id(true)`,启用 `session.use_strict_mode` |
| 过度详细的错误暴露 | 向用户展示原始的数据库错误 | 显示通用信息;详细信息记录到 `error_log()` |
| IDOR (交易访问) | 缺乏所有权检查 | 强制进行所有权检查 (`user_id` 匹配或拥有 admin 角色) |
| 客户端价格篡改 | 价格通过隐藏的表单字段发送 | 服务端根据 `product_id` 从 `product_catalog` 中查询价格 |
| CSRF | 无 | 使用基于会话的 token,并在每个改变状态的表单中通过 `hash_equals()` 进行验证 |
| 不安全的 session/cookie 配置 | 使用默认配置 | 启用 `HttpOnly`, `Secure`, `SameSite=Strict`,设置 15 分钟的空闲超时时间 |
| 静态敏感数据 | N/A | AES-256-CBC 加密 (在结账环节对卡号后四位进行了演示) |
| 缺失安全 headers | 无 | 通过 `.htaccess` 启用 HSTS, CSP, X-Frame-Options, X-Content-Type-Options |
有关漏洞分析和修复方案的完整详细说明,请参阅本项目的技术报告(未包含在本仓库中)。
## 本地运行
要求安装启用了 `mod_rewrite` 和 `mod_headers` 的 **Apache**(基于 `.htaccess` 的重定向和安全 headers 在 PHP 的内置服务器下**不会**生效,因为 `php -S` 会完全忽略 `.htaccess`)。已在 Windows 系统上的 XAMPP (Apache + MariaDB + PHP 8.2) 环境中完成测试。
```
# 1. 将两个 app 部署在你的 web root 下,例如:
# vulnerable_app_source/vulnerable/ -> htdocs/vulnerable
# secure_app_source/secure/ -> htdocs/secure
# 2. 导入两个 schemas
mysql -u root < htdocs/vulnerable/schema.sql
mysql -u root < htdocs/secure/schema.sql
# 3. (可选)配置环境 — 否则 includes/db.php 将回退到
# XAMPP 默认的 root/无密码本地设置
export DB_HOST=localhost
export DB_USER=root
export DB_PASS=
export DB_NAME=secureapp_demo_secure
export APP_ENC_KEY="a-real-32-byte-random-secret-key"
# 4. 启动 Apache 和 MySQL,然后访问:
# https://localhost/secure/register.php
# http://localhost/vulnerable/login.php
```
## 免责声明
本项目是为课程作业而构建的,旨在演示安全编码实践。`vulnerable_app_source/` 包含出于教育分析目的而刻意设置的漏洞,请勿将其运行在可被公开访问的服务器上。
标签:ffuf, Golang, PHP/MySQL, Streamlit, 安全编程, 漏洞修复, 网络安全培训, 访问控制