25 lines
2.6 KiB
Markdown
25 lines
2.6 KiB
Markdown
|
|
# 安全加固实测脚本(2026-09)
|
|||
|
|
|
|||
|
|
本目录是「存储型 XSS / 登录爆破 / 服务降权 / nginx 与 CORS 收敛」四项加固的**可复现实测脚本**与部署脚本留存。
|
|||
|
|
所有脚本都在**服务器上**(或在本地直连测试库时)运行,改动前均已备份并验证。
|
|||
|
|
|
|||
|
|
| 文件 | 用途 | 运行位置 |
|
|||
|
|
|------|------|----------|
|
|||
|
|
| `probe_upload.py` | A 项:登录 → 上传 `xss.svg`(应 400)/ 改名 `.png` 的 SVG(应 400,魔数兜底)/ 真 PNG(应 200);头像与反馈图两个入口都测 | 服务器(打 `127.0.0.1:3000`) |
|
|||
|
|
| `probe_bruteforce.py` | B 项:成功登录清零计数、5 次失败锁定(第 6 次与"正确密码"都返回统一文案)、challenge 限流(第 11 次起 429)、并发闸门观察 | 服务器(打 `127.0.0.1:3000`) |
|
|||
|
|
| `probe_prod.py` | A/D 项(生产):用服务端 `JWT_SECRET` 临时签一个 token,只打"应被拒绝"的路径 + 反馈图测试文件(末尾自删),并打印 CORS 白名单内外行为 | 服务器(打 `127.0.0.1:9000` + 走域名) |
|
|||
|
|
| `probe_export.py` | C 项:Excel 导出(写 `./exports`)在降权后是否可用(测试环境) | 服务器(打 `127.0.0.1:3000`) |
|
|||
|
|
| `smoke_prod.py` | 生产冒烟:SPA 资源、challenge、登录参数校验,并清理测试产生的 Redis 计数键 | 服务器 |
|
|||
|
|
| `make_test_user.py` | 在 `pms_dev` 建/重置实测账号 `13900000009 / SecTest#2026`(role=0,无组织) | 本地(直连 `10.8.0.252`) |
|
|||
|
|
| `nginx-hardening.sh` | D 项:把两份 conf 落到 `/etc/nginx/conf.d/`,在 `nginx.conf` 的 `http{}` 内插入 `limit_req_zone`,`nginx -t` 通过才 reload,失败回滚 | 服务器(先 `pscp` conf 到 `/tmp`) |
|
|||
|
|
| `switch-user-test.sh` | C 项:测试环境两单元 `User=root → User=pms`,失败立即回滚 | 服务器 |
|
|||
|
|
| `deploy-prod-sec.sh` | 生产:二进制原子替换 + 两单元降权,失败回滚(单元 + 二进制) | 服务器 |
|
|||
|
|
|
|||
|
|
## 前置说明
|
|||
|
|
|
|||
|
|
- 脚本内有 `ENV_FILE` 常量指向线上 `.env`(读 `REDIS_URL` / `JWT_SECRET`),**不要把 .env 内容复制到仓库**。
|
|||
|
|
- `probe_upload.py` / `probe_bruteforce.py` 需要从 Redis 读 `challenge:{cid}` 的正确偏移量来模拟"人正确拖动滑块"(服务器没装 `redis-cli`,
|
|||
|
|
脚本里自带一个 30 行的最小 RESP 客户端)。
|
|||
|
|
- 实测账号 `13900000009 / SecTest#2026` 目前**仍留在测试库 `pms_dev`**(role=0,无组织,看不到任何数据)。
|
|||
|
|
如不再需要:`DELETE FROM users WHERE phone='13900000009';`(同时可删除 `uploads/avatars`、`uploads/feedback` 下的测试 PNG)。
|