Files
MES_Manage_View_V20/问题修复方案与今日沟通规划.md

420 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 问题修复方案与今日沟通规划
> **日期**: 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` | 操作记录查询 | 中 |
**修复方案**
```sql
-- ❌ 修复前(字符串拼接)
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 | 按调用频率排序,先修复 **高频 SP**GetTask/Query 类) | 1天 |
| 2 | 修复中等频率 SPCheckRecord/FirstCheck 类) | 0.5天 |
| 3 | 修复低频率 SPMeasuringTool/OptRecords 类) | 0.5天 |
| 4 | 逐条测试验证 | 0.5天 |
| 5 | 上线部署 | 0.5天 |
> 📅 **建议**: 先创建一个统一的参数化模板,后续新增 SP 必须遵循。
---
### 问题 2明文密码存储于 Cookie
| 项目 | 内容 |
|------|------|
| **风险等级** | 🔴 高 — XSS 可窃取密码,同一密码可能用于其他系统 |
| **位置** | `src/views/login/index.vue` line 243-246 |
| **核心原因** | `Cookie.set('password', password, { expires: 7 })` 明文存7天 |
**修复方案**
```javascript
// ❌ 修复前
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"` (最新稳定版) |
**修复方案**
```bash
# 升级 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 |
**修复方案**
```javascript
// ❌ 修复前
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 |
**修复方案**
```javascript
// ❌ 修复前
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
```javascript
// ❌ 三个 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
```javascript
// ❌ 修复前
this.$router.push({ path: '/login' })
// ✅ 修复后
import router from '@/router'
// ...
router.push({ path: '/login' })
```
**工时**: 5分钟
---
### 问题 8GetInfo 硬编码 admin 角色
**位置**: `src/store/modules/user.js` line 83
```javascript
// ❌ 修复前
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
```javascript
// ❌ 修复前
}).catch(() => {
this.loading = false
})
// ✅ 修复后
}).catch((error) => {
this.loading = false
this.$message.error('登录失败:' + (error.message || '网络异常,请联系管理员'))
})
```
**工时**: 5分钟
---
### 问题 10DevServer 强制 HTTPS 无证书
**位置**: `build/webpack.dev.conf.js` line 31
```javascript
// 方案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
> 🔄 更新频率: 每日更新进度状态