You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何规避WAF拦截且无XSS漏洞地实现客户端安全邮件发送

问题改造落地方案

核心思路:彻底放弃将HTML作为前后端传输的内容载体,改用无尖括号的自定义结构化纯文本标记完成富文本内容传输,所有HTML转换逻辑放在WAF后端的服务侧执行,从根源上避免传输链路出现HTML标签、转义实体触发WAF拦截,同时通过白名单转换逻辑杜绝XSS风险。

前端改造(基于JavaScript 1.7实现)

  • 废弃原有直接拼接、提交HTML内容的逻辑,编辑器层统一使用方括号自定义标记存储富文本样式:
    • 换行用[BR]标记,粗体用[B]内容[/B]标记,内嵌图片用[IMG=系统内图片资源ID]标记,超链接用[A=链接地址]链接文本[/A]标记,段落用[P]内容[/P]标记,全程不使用<、>字符。
    • 编辑器输入层加强制校验:所有用户手动输入的半角尖括号<、>直接替换为全角<、>,从入口堵死出现HTML标签、转义实体的可能。
  • 提交请求前做二次校验:如果内容中存在<、>、&lt;、&gt;类HTML特征字符串,直接拦截提示非法输入,不发起请求。
    核心参考代码:
// 输入内容清洗,彻底移除半角尖括号
function cleanInput(rawText) {
  return rawText.replace(/[<>]/g, function(match) {
    return match === '<' ? '<' : '>';
  });
}
// 富文本操作插入对应标记,以粗体功能为例
function insertBold(selectedText) {
  return '[B]' + cleanInput(selectedText) + '[/B]';
}

传输层规则适配

  • 所有富文本内容采用标准form表单编码提交,避免JSON序列化过程中出现转义字符触发WAF语义检测。
  • 联调阶段提取客户WAF的拦截特征库做本地校验,保证过WAF的请求中完全不存在HTML相关特征字符串,拦截率降到0。

后端改造(基于Java 8实现)

  • 服务端接收到前端传输的自定义标记内容后,严格按照「先全量转义,后白名单替换」的逻辑生成邮件HTML内容,从流程上杜绝XSS漏洞:
    1. 第一步全量转义:对接收的所有内容做HTML实体转义,把所有特殊字符转换为HTML实体,这一步完成后内容中不存在任何可被邮件客户端解析的HTML语法。
    2. 第二步白名单替换:仅将预先定义的合法自定义标记,替换为对应安全HTML标签,替换过程严格做属性校验:
      • [BR]直接替换为<br>
      • [B]xxx[/B]严格匹配闭合标记,替换为<strong>xxx</strong>
      • [IMG=xxx]校验xxx必须是系统内已存在的图片资源ID,禁止直接传入外域地址,替换时仅保留src属性,自动剔除onerror、onclick等事件属性
      • [A=xxx]yyy[/A]校验xxx必须为http/https开头的合法地址,拦截javascript:、data:等伪协议,替换时增加rel="noopener"属性
        核心参考代码:
import org.apache.commons.text.StringEscapeUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

// 第一步:全量HTML转义,兼容Java8版本
String safeContent = StringEscapeUtils.escapeHtml4(frontReceivedContent);
// 替换换行标记
safeContent = safeContent.replaceAll("\\[BR\\]", "<br>");
// 替换粗体标记
safeContent = safeContent.replaceAll("\\[B\\](.*?)\\[/B\\]", "<strong>$1</strong>");
// 替换图片标记,做资源ID合法性校验
Pattern imgPattern = Pattern.compile("\\[IMG=([a-zA-Z0-9-]+)\\]");
Matcher imgMatcher = imgPattern.matcher(safeContent);
StringBuffer imgBuffer = new StringBuffer();
while (imgMatcher.find()) {
    String resourceId = imgMatcher.group(1);
    // 校验资源ID在系统资源库中存在
    if (resourceService.isIdExist(resourceId)) {
        imgMatcher.appendReplacement(imgBuffer, "<img src=\"/mail-resource/img/" + resourceId + "\" alt=\"\">");
    } else {
        imgMatcher.appendReplacement(imgBuffer, "[图片已失效]");
    }
}
imgMatcher.appendTail(imgBuffer);
safeContent = imgBuffer.toString();
// 超链接标记替换逻辑同上,增加协议白名单校验即可

邮件发送层兜底

  • 生成的HTML内容作为邮件正文发送时,在邮件头增加内容安全策略字段,禁止脚本执行、未授权外域资源加载,进一步兜底XSS风险。
  • 无富文本需求的场景,可直接将自定义标记剔除、[BR]替换为文本换行符,发送纯文本邮件,安全性更高。

注意:所有HTML转换逻辑必须放在WAF之后的内网服务侧执行,绝对不能在前端完成HTML转换后再提交,否则必然触发WAF拦截。

内容的提问来源于stack exchange,提问作者Baris Soykok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 11:54:23