Add all dashboard projects
This commit is contained in:
419
MES_Manage_View_V20/问题修复方案与今日沟通规划.md
Normal file
419
MES_Manage_View_V20/问题修复方案与今日沟通规划.md
Normal file
@@ -0,0 +1,419 @@
|
||||
# 问题修复方案与今日沟通规划
|
||||
|
||||
> **日期**: 2026-05-21
|
||||
> **版本**: v1.0
|
||||
> **目标**: 将23个问题转化为可执行的修复方案,明确责任人、工期和沟通计划
|
||||
|
||||
---
|
||||
|
||||
## 一、问题优先级总览
|
||||
|
||||
```
|
||||
🔴 Critical (今日必须启动): 5个 — 安全漏洞、数据泄露
|
||||
🟠 High (本周内完成): 5个 — 功能Bug、权限失效
|
||||
🟡 Medium (本月计划): 6个 — 可维护性、稳定性
|
||||
🟢 Low (持续优化): 7个 — 代码质量、最佳实践
|
||||
────────────────────────────────────────────
|
||||
总计: 23个
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 二、🔴 Critical — 今日立即处理
|
||||
|
||||
### 问题 1:SQL 注入漏洞(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 | 修复中等频率 SP(CheckRecord/FirstCheck 类) | 0.5天 |
|
||||
| 3 | 修复低频率 SP(MeasuringTool/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分钟 |
|
||||
|
||||
---
|
||||
|
||||
### 问题 3:Axios 已知 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分钟
|
||||
|
||||
---
|
||||
|
||||
### 问题 7:Vuex 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分钟
|
||||
|
||||
---
|
||||
|
||||
### 问题 8:GetInfo 硬编码 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分钟
|
||||
|
||||
---
|
||||
|
||||
### 问题 10:DevServer 强制 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
|
||||
> 🔄 更新频率: 每日更新进度状态
|
||||
Reference in New Issue
Block a user