2026-10-16-security-scan-and-weak-password-design.md 4.9 KB

安全扫描与弱密码刷新设计

日期:2026-10-16
状态:待评审

背景与目标

业务方要求:

  1. 对项目做安全扫描,重点关注 SQL 注入、XSS 等常见 Web 安全问题。
  2. 将库中密码明文等价于弱密码 111111 的用户,统一改为强密码 Zkxw@123。

本次交付:只出报告、不改业务代码;弱密码另附可执行刷新脚本/SQL。

决策摘要

项 决策
扫描方式 方案 A:静态代码审计(人工 + 定向检索)
扫描交付 Markdown 报告:问题清单 + 风险等级 + 文件位置 + 简述与建议
代码修复 本次不做;报告中给出建议,后续另开任务
弱密码目标 111111 → Zkxw@123
弱密码识别 因 bcrypt 随机盐,须用应用侧 bcrypt.checkpw 校验,不能纯 SQL WHERE password='111111'
弱密码范围 sys_user,del_flag = 0;含已禁用用户(status != '1' 也刷新,避免复用账号时残留弱口令)

1. 安全扫描

1.1 范围

纳入:

  • backend/app/:原始 SQL / text()、字符串拼接查询、动态 SQL(含工作流审批人 SQL 策略)、鉴权与敏感接口相关模式
  • web-admin/src/:v-html、未消毒 HTML、innerHTML 等 XSS 相关用法
  • 业务相关前端(如 mobile-oa-h5/src/、mobile-h5/、miniprogram/ 中同类模式,若存在)

排除:

  • backend/venv/、node_modules/、第三方静态资源(如 web-admin/public/tinymce/)
  • 纯 Demo / mockup HTML(docs/** 演示页、mobile-ui/** 等),除非被生产路径引用

1.2 检查类别(至少覆盖)

类别 关注点
SQL 注入 text() + 用户可控拼接;f"...SELECT...";% / .format 拼 SQL;工作流 strategy=sql
XSS v-html 是否经 sanitizeHtml/DOMPurify;未消毒的 innerHTML
认证/口令(信息项) 默认弱口令文档、明文登录开关等(记入报告,不强制本次改代码)
其他高信号 硬编码密钥/口令、危险 eval/new Function(业务代码)

1.3 风险等级

  • 高:可被外部/低权限用户直接利用,导致读改删数据或执行脚本
  • 中:需特定权限/配置或利用链较长,仍有实质影响
  • 低:防御不完善但当前利用面小,或仅内部可控场景
  • 信息:加固建议、文档/默认配置风险,非直接漏洞

1.4 报告格式与路径

路径:docs/testing/2026-10-16-security-scan-report.md

每条问题包含:

  1. 标题
  2. 风险等级
  3. 文件位置(路径 + 尽量到函数/行号)
  4. 问题简述
  5. 修复建议(文字,不直接改代码)

报告末尾附:扫描方法说明、覆盖范围、已知局限(静态审计无法替代动态渗透)。

2. 弱密码刷新

2.1 约束

  • sys_user.password 存 bcrypt($2b$...),每次哈希盐不同。
  • 无法用单条 UPDATE ... WHERE password = '111111' 命中所有弱密码用户。
  • 新密码明文:Zkxw@123(写入运维说明;哈希由脚本生成)。

2.2 交付物

文件 作用
backend/scripts/reset_weak_password_111111.py 主路径:连接当前环境库,逐用户 verify 是否为 111111,命中则更新为 Zkxw@123 的新 bcrypt 哈希;打印命中 user_no / 数量;支持 --dry-run
docs/sql/2026-10-16-reset-weak-password-111111.sql 辅助:说明为何不能纯 SQL 筛选;给出预生成示例哈希与单条 UPDATE 模板;引导使用上述 Python 脚本

2.3 脚本行为

  1. 读取环境 DB 配置(与现有 backend 一致:.env / .env.local 等)。
  2. 查询 sys_user:del_flag = 0,取出 id, user_no, password, status。
  3. 对每条用 bcrypt 校验明文 111111;命中则 password = bcrypt(Zkxw@123),更新 update_time(若列存在)。
  4. 默认提交事务;--dry-run 只列出将修改的账号。
  5. 不修改业务应用代码、不重置非 111111 的密码。

2.4 运维注意

  • 执行前备份 sys_user 或整库。
  • 执行后通知相关用户使用新密码,并建议首次登录后自行修改。
  • 文档中的默认账号说明(如 admin / 111111)后续由文档任务单独更新(本次可不改 AGENTS.md,可在报告「信息」项列出)。

3. 非目标

  • 不修复报告中的代码漏洞
  • 不做完整渗透测试、依赖 CVE 全量扫描、基础设施扫描
  • 不批量重置「所有用户」密码,仅命中弱密码 111111 的用户

4. 验收标准

  1. 存在上述安全扫描报告,且至少覆盖 SQL 注入与 XSS 两类检索结论(含「未发现」亦需写明检索范围)。
  2. 存在弱密码 Python 脚本与 SQL 说明文件;--dry-run 可列出命中用户;正式执行后原 111111 用户可用 Zkxw@123 登录。
  3. 业务源码无功能性改动(仅新增 docs/scripts/sql 交付物)。