ferdidd/mission-pentest
GitHub: ferdidd/mission-pentest
这是一个基于Node.js和MariaDB的渗透测试任务管理Web应用,通过事务机制防止顾问分配时间冲突,优化团队资源调度。
Stars: 0 | Forks: 0
# 渗透测试任务管理
面向网络安全公司的渗透测试任务管理Web应用程序。
作为**网络数据库**课程的一部分完成的学术项目。
## 核心业务约束
一名顾问绝不能被分配到在时间上存在重叠的两个任务。
此规则通过带有**锁**的**SQL事务**(`SELECT ... FOR UPDATE`)
以及在`INSERT`前进行**重叠验证**来保证,若发生冲突则执行`ROLLBACK`。
## 技术栈
- Node.js + Express 4
- MariaDB 12(驱动程序`mysql2/promise`,连接池)
- `express-session`(httpOnly cookie会话,2小时有效期)
- EJS(服务器端模板,无前端框架)
- `bcryptjs`(密码哈希,成本因子10)
## 快速启动
### Windows(Marwane的工作站)
双击项目根目录下的**`start.bat`**。
该脚本会启动MariaDB(如需要),安装缺失的Node依赖项,
在专用窗口中启动服务器,然后在浏览器中打开
[http://localhost:3000](http://localhost:3000)。
### macOS(Ferdi的工作站)
```
# 先决条件:本地 MariaDB (brew install mariadb && brew services start mariadb)
cp .env.example .env # à créer — voir Annexe B du rapport
npm install
mariadb -u root missions_pentest < db/schema.sql
mariadb -u root missions_pentest < db/migration-v2.sql
mariadb -u root missions_pentest < db/migration-v3.sql
mariadb -u root missions_pentest < db/seed.sql
node db/seed-users.js
npm start # ou : node app.js
```
## 项目结构
```
Missions_Pentest/
|-- app.js point d'entree Express
|-- package.json
|-- .env variables d'environnement
|-- start.bat / start.py lanceur tout-en-un
|-- db/
| |-- schema.sql schema initial
| |-- migration-v2.sql ajout du statut en_attente
| |-- migration-v3.sql catalogue de services + specialites
| |-- seed.sql donnees de test
| |-- seed-users.js creation des comptes (bcrypt)
|-- src/
| |-- db/
| | |-- config.js
| | |-- connection.js pool mysql2
| |-- middleware/
| | |-- auth.js requireAuth, requireRole, injectLocals
| |-- routes/
| | |-- index.js routes Express
| |-- controllers/
| | |-- authController.js
| | |-- homeController.js
| | |-- clientController.js
| | |-- clientSpaceController.js espace client + verification de disponibilite
| | |-- consultantController.js
| | |-- missionController.js
| | |-- assignationController.js transaction SQL centrale
| | |-- vulnerabiliteController.js
| | |-- rapportController.js
| | |-- planningController.js
| |-- views/ templates EJS
| |-- public/css/style.css
```
## 数据模型(9张表)
| 表名 | 作用 |
|----------------------|-----------------------------------------------------------------|
| `utilisateur` | 登录账户(管理员/顾问/客户) |
| `client` | 客户公司 |
| `consultant` | 受薪专家 |
| `service` | 17项服务的目录(V3版本) |
| `consultant_service` | 顾问与服务间的多对多专业领域关系(V3版本) |
| `mission` | 渗透测试任务 |
| `assignation` | 顾问与任务的分配关系(核心表) |
| `vulnerabilite` | 任务期间发现的漏洞 |
| `rapport` | 与任务关联的最终报告 |
## 演示账户
| 登录名 | 密码 | 角色 |
|-------------------------|--------------|-------------|
| `admin` | `admin123` | 管理员 |
| `lucas` | `lucas123` | 顾问 |
| `sophie` | `sophie123` | 顾问 |
| `contact@cybercorp.be` | `client123` | 客户 |
| `rssi@securebank.be` | `client123` | 客户 |
## 主要功能
- 基于会话的身份验证,包含3种角色
- 完整的CRUD操作:`client`、`consultant`、`mission`、`assignation`、`vulnerabilite`、`rapport`
- **专属客户空间**:注册、任务跟踪、报告下载、账户管理
- **17项服务目录**(外部/内部入侵、Web/移动/API/Wi-Fi/云渗透测试、红队演练、社会工程、审计等)
- **自动可用性检查**,在提交请求时即时验证
- 请求表单中通过**AJAX预览**可用时间段
- 按顾问查看全局规划
- 防止重叠的受保护分配事务
## 手动启动(备选方案)
如果希望手动启动:
```
# 仅需一次:创建 schema 和 seed
mariadb -u root -ptest -e "CREATE DATABASE IF NOT EXISTS missions_pentest CHARACTER SET utf8mb4;"
mariadb -u root -ptest missions_pentest < db/schema.sql
mariadb -u root -ptest missions_pentest < db/migration-v2.sql
mariadb -u root -ptest missions_pentest < db/migration-v3.sql
mariadb -u root -ptest missions_pentest < db/seed.sql
node db/seed-users.js
# 启动
npm start
```
在`.env`中进行配置:
```
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=test
DB_NAME=missions_pentest
SESSION_SECRET=une-valeur-aleatoire
PORT=3000
```
## 分配事务
```
START TRANSACTION
SELECT date_debut, date_fin FROM mission WHERE mission_id = ? FOR UPDATE
SELECT ... FROM assignation WHERE consultant_id = ?
AND NOT (date_fin < :debut OR date_debut > :fin)
FOR UPDATE
SI aucun conflit -> INSERT INTO assignation ... ; COMMIT
SINON -> ROLLBACK ; affichage des conflits a l'utilisateur
```
两个区间 `[a1, a2]` 和 `[b1, b2]` 重叠的条件是:`NOT (a2 < b1 OR a1 > b2)`。
## 建议的手动测试
1. 以`admin`身份登录,创建一个时间范围为 `2026-07-01 -> 2026-07-10` 的任务。
2. 将`Lucas`分配到该任务:成功。
3. 创建第二个时间范围为 `2026-07-05 -> 2026-07-15` 的任务。
4. 尝试将`Lucas`分配到第二个任务:拒绝,并显示冲突列表。
5. 将日期调整为 `2026-07-11 -> 2026-07-20`,然后重新分配:成功。
6. 注销,使用 `contact@cybercorp.be / client123` 登录。
7. 提交一个新的请求:验证可用专家列表是否显示。
## 安全性
- 密码使用bcrypt哈希存储(永不存储明文)
- `httpOnly` + `sameSite=lax` 会话,有效期2小时
- 仅使用参数化SQL查询
- 通过中间件进行角色验证(`requireAdmin`, `requireStaff`, `requireClient`)
- 客户空间通过系统性的 `WHERE client_id = ?` 进行隔离
- 数据库层面进行日期和外键的一致性检查
## 已知限制
- 无CSRF防护(本地学术项目)
- 无实际的PDF报告上传(仅存储路径)
- 无图形化的规划日历视图
- 无邮件通知功能
标签:bcryptjs, EJS, Express, GNU通用公共许可证, Linux 内核安全, MariaDB, MITM代理, mysql2, Node.js, Web 应用, Web 开发, 事务管理, 任务管理, 会话管理, 学术项目, 安全测试, 密码哈希, 攻击性安全, 数据库, 数据库事务, 服务器端渲染, 服务目录, 用户认证, 网络安全, 自定义脚本, 锁机制, 隐私保护, 项目管理