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 开发, 事务管理, 任务管理, 会话管理, 学术项目, 安全测试, 密码哈希, 攻击性安全, 数据库, 数据库事务, 服务器端渲染, 服务目录, 用户认证, 网络安全, 自定义脚本, 锁机制, 隐私保护, 项目管理