关于c#:清理发往电子邮件的用户输入

Sanitize user inputs destined for email

我正在考虑从面向Internet的ASP.NET MVC5网站收集的用户提供的输入的xss清理。 在浏览器中呈现这些输入时对其进行消毒已得到充分记录并可以满足。 但是,在构建包含所述用户提供的值的电子邮件的上下文中,我没有找到有关如何最好地处理清理的声誉指南。

默认情况下,我将发送纯文本消息,表明我不需要对这些值进行HTML编码。 但是,我担心现代邮件客户端会尝试将任何看起来像HTML的内容呈现为HTML。

我可以只是HtmlEncode一切,但后来我们考虑"公司名称"的输入,它可以合法地包含"&" 符号,我不热衷于发送一条显示"Father & Son Ltd."的消息


因此,XSS可能存在于电子邮件中,并且过去曾发生过,但它被认为是电子邮件客户端中的漏洞,与发件人无关。它几乎只发生在基于Web的电子邮件(如gmail)而不是像Outlook这样的东西中。电子邮件客户端通常(并且不应该)从电子邮件(特别是桌面客户端)运行脚本。

所以我想说你真的不需要担心这个问题。它将被视为电子邮件客户端中的漏洞,如果攻击者知道此类漏洞,他们就不会费心使用您的奇怪客户端,因为他们可以通过发送电子邮件来准确地制作电子邮件。他们自己。

我只是从安全的角度回答,如果您关心的是客户端,包括样式/链接/等,这是一个不同的问题。我会考虑任何电子邮件客户端尝试呈现纯文本电子邮件,因为HTML已被破坏,而不是您应该担心的事情。


发送电子邮件时,您可以指定它是纯文本还是HTML电子邮件。

1
2
3
MailMessage mail = new MailMessage("[email protected]","[email protected]");
mail.IsBodyHtml = false;
...

这会添加一个标题,指示电子邮件客户端如何显示电子邮件内容。现代电子邮件客户端将尊重此设置。

因此,如果您要发送纯文本电子邮件,请不要做任何事情来逃避HTML值。

如果您要发送HTML电子邮件,则需要对任何用户提供的值进行HTML编码。这不是一个安全问题,而是一个正确性问题:如果您的用户输入"Bruce Lee,即使它不是恶意的,您也不希望在该点之后将其余的电子邮件解释为巨大的HTML标记,使其对用户有效隐形。

如果您最终发送的是HTML邮件,则不希望整个模板采用纯文本格式。您可能需要考虑使用Razor模板,它将为您构建电子邮件的HTML提供更好的工具支持,并使默认情况下基于模型的值进行HTML编码:

1
2
3
4
5
6
7
8
@model WelcomEmailModel

<p>
Dear @Model.CompanyName,
</p>

<p>
...