问题描述
report_feedback MCP 工具的后端仅做 Pydantic 长度校验(10-2000字符),不过滤 HTML 标签。<script> 等危险内容会原样存入数据库。
风险等级:P0
虽然前端(React + Ant Design)默认对 JSX 表达式做 HTML 转义,但以下场景可能导致 XSS 攻击成功:
- 使用
dangerouslySetInnerHTML 渲染反馈内容
- Ant Design 组件的自定义 render 使用
innerHTML
- 未来前端重构或引入富文本组件
即使前端当前安全,后端不过滤本身就是 defense-in-depth 的缺失。
潜在攻击链
- 攻击者获取有效 API token
- 通过
report_feedback 提交包含 <script> 的恶意 payload
- 管理员在后台查看反馈内容时触发 XSS
- 攻击者获取管理员 session/cookie → 权限提升
复现步骤
- 调用
report_feedback 工具,feedback_message 参数包含 <script>alert(1)</script>
- 观察后端接受并存入数据库(无过滤)
- 在管理后台查看该反馈记录
修复建议
- 后端输入侧 sanitize:对
feedback_message 字段 strip HTML 标签和事件属性(建议使用成熟的 sanitize 库而非正则黑名单)
- 前端渲染路径审查:确认反馈内容渲染未使用
dangerouslySetInnerHTML
- 存量数据清理:修复后清理数据库中已存在的含 HTML 标签的反馈记录
- 自动化回归测试:CI 中加入 XSS payload 的回归测试用例,防止后续提交引入回归
发现来源
QA 安全审计(2026-03-28),详见 QA 学习笔记 #16。
问题描述
report_feedbackMCP 工具的后端仅做 Pydantic 长度校验(10-2000字符),不过滤 HTML 标签。<script>等危险内容会原样存入数据库。风险等级:P0
虽然前端(React + Ant Design)默认对 JSX 表达式做 HTML 转义,但以下场景可能导致 XSS 攻击成功:
dangerouslySetInnerHTML渲染反馈内容innerHTML即使前端当前安全,后端不过滤本身就是 defense-in-depth 的缺失。
潜在攻击链
report_feedback提交包含<script>的恶意 payload复现步骤
report_feedback工具,feedback_message参数包含<script>alert(1)</script>修复建议
feedback_message字段 strip HTML 标签和事件属性(建议使用成熟的 sanitize 库而非正则黑名单)dangerouslySetInnerHTML发现来源
QA 安全审计(2026-03-28),详见 QA 学习笔记 #16。