多智能体循环迭代与安全防护修复 最近几天集中把剩余的高优先级Bug清理了一遍主要是三个方向的工作多智能体协作加了反馈循环机制、前端修了XSS漏洞、后端补了限流和类型一致性一、开发目标为多智能体协作流程增加CriticAgent反馈循环让SQL生成质量可迭代提升修复前端chat.js的XSS注入风险为AuthController添加IP限流保护修正SqlAuditLog的userId类型与其他实体保持一致排查QueryHistoryRepository的findAll()暴露风险二、核心开发工作2.1 多智能体循环迭代机制之前的多智能体协作是单向流水线规划→检索→生成SQL→批判→执行。CriticAgent审查完SQL之后不管发现什么问题审查结果都被直接丢掉了ActionAgent拿到的是未修正的SQL直接去执行。说白了CriticAgent白干了。这次在AgentOrchestrator里加了一个循环逻辑。CriticAgent审查完之后如果发现SQL有问题就把问题反馈回来重新生成SQL然后再审查直到通过或者达到最大迭代次数。具体来说新增MAX_CRITIC_ITERATIONS 3常量最多循环3轮防止无限迭代阶段4从单向执行改为循环Critic审查→发现问题→用反馈重新生成→再审查→通过后执行generateSqlWithLLM()新增correctionFeedback参数首次生成时传null修正时传入Critic的反馈新增buildSqlCorrectionPrompt()方法把Critic的问题描述注入到修正prompt里改完之后的流程变成了生成SQL→Critic审查→有问题就带着反馈重新生成→再审查→最多3轮→通过后执行。CriticAgent终于不是摆设了。2.2 前端XSS修复chat.js里渲染消息时用的是innerHTML如果LLM返回的内容里夹带了恶意HTML或JS代码就会被直接插入到页面里执行。虽然正常使用不太可能触发但作为安全漏洞必须堵上。修复方式是加强escapeHtml()函数原来只转义了三个字符现在补上了和防止通过HTML属性注入。然后排查了chat.js里所有使用innerHTML的位置确认每个地方拼入的外部数据都经过了escapeHtml转义。一共排查了5处innerHTML使用全部安全。2.3 AuthController IP限流登录和注册接口之前没有任何限流保护攻击者可以暴力破解密码或者批量注册账号。这次加了一个基于IP的内存限流器用ConcurrentHashMap存储每个IP的请求计数和首次请求时间1分钟时间窗口内同一个IP最多允许5次请求超过限制直接返回429状态码和提示信息定时清理过期的计数记录避免内存泄漏2.4 SqlAuditLog类型修正SqlAuditLog实体的userId字段是String类型但其他所有实体QueryHistory、AgentMemory等的userId都是Long类型。类型不一致早晚要出问题这次统一改成了Long。改动涉及面比预期大一些SqlAuditLog字段改了之后SqlAuditService的buildAuditLog方法和三个公开日志方法的参数类型都要跟着改SqlSecurityAuditAspect里的userId变量也要从String改成Long。改动本身不难就是涉及文件多要确保每个调用方都改到位。2.5 QueryHistoryRepository暴露排查这个Bug说QueryHistoryRepository继承了JpaRepository默认暴露了findAll()方法如果误调用会返回所有用户的历史记录。排查了一遍整个项目的代码没有任何地方调用过findAll()所有查询都是按userId过滤的。所以这个风险目前是理论上的不需要改代码确认安全就行。三、关键实现细节循环迭代的终止条件设计最多3轮的限制是经过考虑的。每轮迭代都要调一次LLM3轮就是额外的2次LLM调用首次生成不算迭代。如果CriticAgent连3轮都审不过说明要么是用户的问题太模糊要么是schema信息不够继续迭代也不会有改善。超过3轮就直接用最后一次的结果执行把审查结果展示给用户参考。IP限流的内存管理限流计数器存在内存里如果不清理会一直涨。这次在每次限流检查时顺带清理过期的计数记录超过1分钟的这样不需要额外的定时任务代码也更简洁。当然缺点是如果长时间没有请求过期记录不会被主动清理不过一个IP一条记录的内存占用可以忽略不计。SqlAuditLog类型变更的连锁反应改一个字段的类型看起来很简单但userId在审计日志的调用链里传递了好几层Controller→Aspect→AuditService→AuditLog。每一层的变量类型都要跟着改漏一层就编译不过。这次逐层排查才确保全部改到位。四、开发总结这次完成了三批修复Bug 多智能体循环迭代AgentOrchestrator增加CriticAgent反馈循环最多3轮迭代SQL生成质量可自我修正Bug 前端XSSescapeHtml函数补全5字符转义排查5处innerHTML全部安全Bug IP限流AuthController登录注册接口增加基于IP的限流保护1分钟5次上限Bug 类型一致性SqlAuditLog.userId从String改为Long同步修改AuditService和AspectBug Repository暴露代码审查确认无findAll()调用风险已消除本次开发提示词修复Bug在AgentOrchestrator中为多智能体协作增加循环迭代机制。CriticAgent审查SQL后如果发现问题将反馈传递给generateSqlWithLLM重新生成最多迭代3轮通过后才执行。新增MAX_CRITIC_ITERATIONS常量和buildSqlCorrectionPrompt方法。 修复Bug加强chat.js中escapeHtml函数的转义范围从3个字符扩展到5个字符增加双引号和单引号。排查所有innerHTML使用位置确保外部数据都经过转义。 修复Bug为AuthController的登录和注册接口添加基于IP的限流保护使用ConcurrentHashMap计数1分钟窗口内同一IP最多5次请求超限返回429。 修复Bug将SqlAuditLog实体的userId字段从String改为Long同步修改SqlAuditService的buildAuditLog方法和公开日志方法的参数类型以及SqlSecurityAuditAspect中的userId变量类型。 修复Bug排查QueryHistoryRepository的findAll()暴露风险确认项目中无任何代码调用findAll()。