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

如何全局防范邮件模板的HTML注入?转义默认内容问题求助

解决邮件模板中的HTML注入问题

核心结论:必须单独对用户输入的动态变量进行HTML转义,再填充到模板中,全局转义不可行——因为模板本身需要保留合法的HTML结构,全局转义会破坏预设的邮件格式。

为什么全局转义行不通

你之前尝试的全局escapeHtml会把模板里的<p>这类合法标签转义成&lt;p&gt;,最终邮件会显示纯文本标签而非格式化内容,完全不符合预期。

正确的处理方式

只针对用户提供的动态内容(姓名、正文等)进行HTML转义,模板中的固定HTML部分保持原样。以你的Kotlin代码为例:

// 单独转义用户输入的变量
val escapedName = escapeHtml(contact.name)
val escapedBody = escapeHtml(contact.body)

// 将转义后的变量填充到模板
val finalBody = "<p>Hello $escapedName, we confirm that we received your request: $escapedBody</p>"

// 发送邮件
mail.sendMail(email, subject, finalBody)

转义后,用户输入的<button>Click me to be hacked</button>会变成&lt;button&gt;Click me to be hacked&lt;/button&gt;,在邮件客户端中只会显示为普通文本,不会被解析为可交互的HTML元素,彻底避免注入风险。

更优雅的替代方案

如果不想手动处理每个变量的转义,可以使用专业的模板引擎(如Thymeleaf、FreeMarker),这类引擎默认会对动态变量进行HTML转义,同时保留模板中的合法HTML结构。

比如用Thymeleaf编写模板:

<p>Hello [[${contact.name}]], we confirm that we received your request: [[${contact.body}]]</p>

这里的[[${...}]]是Thymeleaf的自动转义表达式,引擎会自动处理用户输入的转义,你只需传入原始的用户数据即可,无需手动调用escapeHtml。

关键提醒

不存在能同时保留模板HTML和防范注入的全局方案,因为合法的模板结构与用户输入的不可信内容是混合存在的,必须明确区分:固定模板部分保留HTML,用户输入部分强制转义。

内容的提问来源于stack exchange,提问作者juske xd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:50:27