Agent 把工具返回的内容显示成富文本,怎样避免页面执行其中的脚本
Agent把工具返回内容显示成富文本时,应把内容当作不可信输入,由渲染层执行上下文合适的编码或净化。模型说安全、来源在内网或提示词要求不要输出脚本,都不能代替浏览器边界。本文只用无害格式标记和属性名称清单核对策略,没有可执行攻击载荷,也不会运行脚本。
先决定哪里允许什么格式
合成客服界面有纯文本摘要、允许少量强调的说明区与受控来源链接。摘要不需要HTML,就按文本显示;说明区只开放必要标签;链接单独验证目标与协议。不能所有输出都交给一个可插入任意HTML的组件,再期待模型自律。
工具结果、用户输入与模型回答都可能包含格式字符。某个来源是受信业务系统,不代表其中每一条备注都由可信管理员编辑。先定义允许标签、属性和链接类型,业务真不需要的格式不开放,减少为装饰引入的复杂边界。
编码与净化适用对象不同
OWASP XSS防护说明按输出上下文区分编码,并讨论需要保留HTML时的净化。HTML文本、属性和URL不是同一上下文,不能通用替换几个字符就称全部安全。使用维护中的工具并固定配置,避免临时手写脆弱过滤规则。
纯文本里显示格式标记,应呈现为文字而非元素;允许富文本时,净化后仅保留约定格式。净化以后若又拼接不可信属性或重新解析,仍可能绕过原边界,所以要核对最终进入页面的内容与整个渲染路径,不仅看中间字符串。
安全附件演示预期而非攻击
下载富文本渲染策略与无害用例。样例使用合成加粗与说明文字,危险属性只记录名称,危险协议只记录分类,不提供处理器、脚本或外联地址。所有HTML都在JSON字符串中,离线预览不会直接作为页面执行。
测试纯文本区时,无害加粗标记仍应是可见文字;富文本区可保留允许的加粗,但移除未登记属性。链接测试按协议与目标规则做判定,不实际访问不可信目标。附件的预期用于配置审核与隔离UI测试,不是全面安全认证。
链接与资源也受控
允许用户点开的来源链接,应有明确名称,按业务规则限制协议和目标。不能从模型输出任意URL直接生成可执行跳转。图片等外部资源也可能带来跟踪或数据外发,是否允许载入需单独确定;本文不下载远程资源,也不将URL检查包装成万能防护。
结构化卡片更适合有固定字段的业务结果。服务端传标题、正文和链接对象,前端按受控组件渲染,减少自由HTML需求。但结构化并不自动安全,字段进入属性或链接时仍要采用相应验证,不能把所有风险归为模型输出格式。
检查多阶段渲染与回显
聊天历史、搜索高亮、错误提示、消息预览和导出页面可能使用不同组件。主聊天窗口安全,不代表后台回看也安全;同一内容在每个实际呈现位置检查。Markdown转HTML后依旧遵守渲染边界,不能认为原始格式是Markdown就不需要净化。
重复编辑或保存后再展示,也可能改变编码次数。过度编码导致乱码需要修复,但不能通过关掉全部防护解决。记录原文、净化策略与最终受控表示,便于定位是哪一层重新解释;日志本身展示内容时也不能成为另一条不受控渲染路径。
验收不依赖模型自评
检查允许格式是否保留、禁止属性是否去除、链接不允许类别是否拒绝,以及最终组件是否绕过策略。不要让Agent阅读自己的输出后回答有没有XSS来充当测试。安全配置与组件升级时,重放受影响的无害夹具,真实观察保持待填写。
外部指令影响模型的测试可看提示词注入边界,本题属于客服问答的浏览器呈现工程。通过定制咨询提供现有渲染组件、允许格式与实际展示位置,可评估编码、净化和回显验收范围。