Files
yl/MES_Manage_View_V20/问题修复方案与今日沟通规划.md
2026-05-23 14:07:11 +08:00

13 KiB
Raw Blame History

问题修复方案与今日沟通规划

日期: 2026-05-21 版本: v1.0 目标: 将23个问题转化为可执行的修复方案明确责任人、工期和沟通计划


一、问题优先级总览

🔴 Critical (今日必须启动):  5个 — 安全漏洞、数据泄露
🟠 High     (本周内完成):    5个 — 功能Bug、权限失效
🟡 Medium   (本月计划):      6个 — 可维护性、稳定性
🟢 Low      (持续优化):      7个 — 代码质量、最佳实践
────────────────────────────────────────────
总计: 23个

二、🔴 Critical — 今日立即处理

问题 1SQL 注入漏洞60+ 存储过程)

项目 内容
风险等级 🔴 极高 — 攻击者可构造恶意输入窃取/篡改数据库
影响范围 script.sql 中所有 sp_executesql + 字符串拼接的 SP
核心原因 用户输入直接 + 拼接到 SQL未使用参数化

受影响的存储过程(高频调用类):

存储过程 用途 调用频率
MES_OrderPlanned_Query 排产查询
MES_OrderPlanned_Queryzp 装配排产查询
MES_ProductCenter_GetTask 机加任务查询 极高
MES_ProductCenter_GetTask_zp 装配任务查询 极高
MES_ProductAdmin_Query 订单查询
MES_ProductAdmin_GetRptRecords 报工记录查询
MES_QulityInspection_GetTask 质检任务查询
MES_QulityInspection_CheckRecord_Query 质检记录查询
MES_QulityInspection_FirstCheckRecords 首检记录查询
MES_QulityInspection_MeasuringTool 量具查询
MES_ProductCenter_OptRecords 操作记录查询

修复方案

-- ❌ 修复前(字符串拼接)
if(@合同号<>'') set @selectStrWhere = @selectStrWhere 
    + ' and [合同号] like ''%' + @合同号 + '%'''
EXEC sp_executesql @selectStr

-- ✅ 修复后(参数化查询)
if(@合同号<>'') set @selectStrWhere = @selectStrWhere 
    + ' and [合同号] like ''%'' + @合同号 + ''%'''
-- 传入参数定义
EXEC sp_executesql @selectStr, 
    N'@合同号 nvarchar(50), @订单号 int, ...', 
    @合同号=@合同号, @订单号=@订单号, ...

执行计划

步骤 内容 工时
1 按调用频率排序,先修复 高频 SPGetTask/Query 类) 1天
2 修复中等频率 SPCheckRecord/FirstCheck 类) 0.5天
3 修复低频率 SPMeasuringTool/OptRecords 类) 0.5天
4 逐条测试验证 0.5天
5 上线部署 0.5天

📅 建议: 先创建一个统一的参数化模板,后续新增 SP 必须遵循。


项目 内容
风险等级 🔴 高 — XSS 可窃取密码,同一密码可能用于其他系统
位置 src/views/login/index.vue line 243-246
核心原因 Cookie.set('password', password, { expires: 7 }) 明文存7天

修复方案

// ❌ 修复前
setCookie(username, password, checked) {
  Cookie.set('username', username, { expires: 7 })
  Cookie.set('password', password, { expires: 7 })   // 明文
  Cookie.set('checked', checked, { expires: 7 })
}

// ✅ 修复后 — 方案A去掉密码存储只记住用户名
setCookie(username, password, checked) {
  Cookie.set('username', username, { expires: 7 })
  // 不再存储密码
  Cookie.set('rememberUser', checked ? '1' : '0', { expires: 7 })
}
getCookie() {
  this.loginForm.username = Cookie.get('username') || ''
  this.loginForm.password = ''  // 永不清空密码框
  this.loginForm.checked = Cookie.get('rememberUser') === '1'
}

// ✅ 修复后 — 方案B如需自动登录存 Token 代替密码
// 登录成功后,后端返回 refreshToken 存入 httpOnly Cookie
步骤 内容 工时
1 修改 setCookie() 去掉密码存储 15分钟
2 修改 getCookie() 只回填用户名 10分钟
3 修改 clearCookie() 同步更新 5分钟
4 测试登录流程 10分钟

问题 3Axios 已知 CVE

项目 内容
风险等级 🔴 中 — CVE-2021-3749 ReDoS
位置 package.json"axios": "^0.21.4"
目标版本 "axios": "^1.7.2" (最新稳定版)

修复方案

# 升级 axios
npm install axios@^1.7.2

# 注意axios 1.x 有 Breaking Changes
# 1. 取消请求 API 从 CancelToken 改为 AbortController
# 2. headers 配置格式略有变化
# 3. 需要检查项目中的 axios 用法是否兼容
步骤 内容 工时
1 执行 npm install axios@^1.7.2 5分钟
2 检查 src/utils/request.js 兼容性 15分钟
3 检查所有 API 调用是否正常 15分钟
4 回归测试 15分钟

问题 4开发代理 HTTPS 证书绕过 + 死代码

项目 内容
风险等级 🔴 低(仅开发环境)
位置 config/index.js line 18-38

修复方案

// ❌ 修复前
proxyTable: {
  '/api/b1s': {
    target: 'https://192.168.2.90:50000',
    secure: false,  // 跳过证书验证
  },
  '/openapi/v1': {                           // ← 死代码路径
    pathRewrite: { '^/api/tm': '/openapi/v1' }  // ← 永远不匹配
  }
}

// ✅ 修复后
proxyTable: {
  '/api/b1s': {
    target: 'https://192.168.2.90:50000',
    secure: true,  // 启用证书验证(生产环境必须)
    // 如为自签名证书,配置 ca 字段
    // ca: fs.readFileSync('path/to/cert.pem')
  },
  '/api/tm': {                               // ← 修正路由
    target: 'http://192.168.2.90:8082',
    changeOrigin: true,
    pathRewrite: { '^/api/tm': '/openapi/v1' }  // ← 正确匹配
  }
}
步骤 内容 工时
1 修正 /api/tm 代理路径 5分钟
2 SAP B1 证书处理联系IT获取证书 视情况
3 测试代理是否正常 10分钟

问题 5登录密码拼在 URL 参数中

项目 内容
位置 src/api/login.js line 13

修复方案

// ❌ 修复前
param: `用户名=${username}&密码=${password}`

// ✅ 修复后 — 将密码放入 JSON body 而非 URL param
data: {
  UserID: state.state.user.id,
  ModularID: router.currentRoute.path,
  type: '1',
  name: '菜单模块系统_用户名密码_查询数据',
  param: JSON.stringify([
    { name: '用户名', value: username, type: 'string', output: '0' },
    { name: '密码', value: password, type: 'string', output: '0' }
  ])
}

💡 注意:这需要后端 MESCommonBase.ashx 也支持从 body 中解析参数。如果短期无法改后端,至少对密码做 Base64 混淆(非加密但比明文好)。


三、🟠 High — 本周必须完成

问题 6修改密码验证器 Bug复制粘贴错误

位置: src/views/login/index.vue line 119-130

// ❌ 三个 typeof 都检查同一个字段
if (typeof(this.form.againPassword) === 'string' || 
    typeof(this.form.againPassword) === 'string' || 
    typeof(this.form.againPassword) === 'string')

// ✅ 修复后:移除无意义的验证器
// 这个 validator 逻辑本身就是错误的,应该删除并简化:
rules: {
  againPassword: [
    { required: true, message: '请输入确认密码', trigger: 'blur' },
    { validator: (rule, value, callback) => {
        if (value !== this.form.newPassword) {
          callback(new Error('两次输入密码不一致'))
        } else {
          callback()
        }
      }, trigger: 'blur' }
  ],
  Account: [{ required: true, message: '请输入工号', trigger: 'blur' }],
  beforPassword: [{ required: true, message: '请输入原密码', trigger: 'blur' }],
  newPassword: [{ required: true, message: '请输入新密码', trigger: 'blur' }]
}

工时: 20分钟


问题 7Vuex Action 中 this.$router undefined

位置: src/store/modules/user.js line 44-45

// ❌ 修复前
this.$router.push({ path: '/login' })

// ✅ 修复后
import router from '@/router'
// ...
router.push({ path: '/login' })

工时: 5分钟


问题 8GetInfo 硬编码 admin 角色

位置: src/store/modules/user.js line 83

// ❌ 修复前
commit('SET_ROLES', 'admin')

// ✅ 修复后(使用后端返回的真实角色)
getInfo(state.token).then(response => {
  const data = response.data
  if (data && data.length > 0) {
    commit('SET_ROLES', data[0].Roles_Function || [])
  }
  resolve(response)
})

工时: 15分钟


问题 9登录错误静默吞掉

位置: src/views/login/index.vue line 198-200

// ❌ 修复前
}).catch(() => {
  this.loading = false
})

// ✅ 修复后
}).catch((error) => {
  this.loading = false
  this.$message.error('登录失败:' + (error.message || '网络异常,请联系管理员'))
})

工时: 5分钟


问题 10DevServer 强制 HTTPS 无证书

位置: build/webpack.dev.conf.js line 31

// 方案A本地开发关闭 HTTPS
devServer: {
  https: false,  // 本地开发无需HTTPS
}

// 方案B配置自签名证书如需测试HTTPS
devServer: {
  https: {
    cert: fs.readFileSync('path/to/localhost.crt'),
    key: fs.readFileSync('path/to/localhost.key')
  }
}

工时: 10分钟


四、今日沟通规划

4.1 上午 (9:00 - 12:00) — 问题确认与方案评审

时间 主题 参与人 目标
9:00-9:30 安全漏洞通报SQL注入/明文密码/Axios CVE 技术负责人 + DBA 确认修复优先级,授权立即启动
9:30-10:00 SQL注入修复方案评审 DBA + 后端开发 确定参数化模板,分工修复
10:00-10:30 前端安全问题修复方案Cookie密码/密码URL传参/GetInfo admin 前端开发 分配任务,确定代码改动范围
10:30-11:00 生产环境配置审查HTTPS证书/SourceMap/代理) 运维 + 开发 审查 config/index.js 和 build 配置
11:00-12:00 开始修复 Critical 问题 开发团队 实际编码

4.2 下午 (13:30 - 17:30) — 修复执行与验证

时间 主题 参与人 目标
13:30-15:00 SQL注入修复第1批高频SP DBA 完成 GetTask/Query 类 SP 改造
13:30-14:30 前端安全问题修复 前端开发 完成问题2/3/5/7/8/9
14:30-15:00 Webpack/构建配置修复 前端开发 完成问题4/10
15:00-16:00 集成测试 全体 验证修复后功能正常
16:00-16:30 修复 verifyValue 验证器 Bug 前端开发 完成问题6
16:30-17:00 代码 Review + 提交 技术负责人 审查所有改动,提交 Git
17:00-17:30 今日总结 + 明日计划 全体 回顾进展,规划明天 Medium 问题

4.3 沟通要点

议题 需要确认 决策人
SQL注入修复范围 是否全部SP都要改还是先改高频 技术负责人
Axios 升级风险 1.x Breaking Changes 是否影响现有功能? 前端开发
Cookie 密码 去掉后用户每次都要输入密码,接受吗? 项目负责人
后端支持 JSON body MESCommonBase.ashx 能否改造成接收JSON 后端开发
数据库日志263GB 是否可以切 SIMPLE 恢复模式? DBA

五、修复进度跟踪表

# 问题 优先级 状态 负责人 预计工时
1 SQL注入 (高频SP) 🔴 待开始 DBA 3天
2 明文密码Cookie 🔴 待开始 前端 0.5h
3 Axios CVE升级 🔴 待开始 前端 1h
4 代理配置修正 🔴 待开始 前端 0.5h
5 密码URL传参 🔴 待开始 前端+后端 2h
6 validateValue Bug 🟠 待开始 前端 0.5h
7 this.$router undefined 🟠 待开始 前端 0.2h
8 GetInfo admin硬编码 🟠 待开始 前端 0.3h
9 登录错误静默 🟠 待开始 前端 0.2h
10 DevServer HTTPS 🟠 待开始 前端 0.2h
11 外协报表供应商Bug 🟠 已完成 DBA 已修复
12 SourceMap泄露 🟡 待开始 前端 0.2h
13 TRUNCATE风险 🟡 待开始 DBA 1h
14 日志263GB 🟡 待开始 DBA 2h
15 无用依赖install 🟡 待开始 前端 0.2h
16 ESLint规则 🟡 待开始 前端 1h
17 Vue 2 EOL 🟢 规划中 架构 长期
18-23 其他低优先级 🟢 待排期 团队 碎片时间

六、今日预计产出

产出物 形式 说明
SQL注入修复高频SP fix_sql_injection_batch1.sql 10个高频 SP 参数化改造
前端安全修复 Git commit 问题2/7/8/9 代码修改
构建配置修正 Git commit 问题4/10 配置修改
Axios 升级 package.json 升级到 1.7.x
Git 提交记录 Git log 所有修改的提交历史
📋 明日计划 本文档更新 Medium 问题修复安排

📅 文档日期: 2026-05-21 🔄 更新频率: 每日更新进度状态