【问题标题】:Sanitize user inputs destined for email清理用于电子邮件的用户输入
【发布时间】:2015-10-03 18:02:47
【问题描述】:

我正在考虑对从面向 Internet 的 ASP.NET MVC5 网站收集的用户提供的输入进行 xss 清理。在浏览器中显示这些输入时对其进行清理是有据可查的并且可以满足。但是,在构建包含上述用户提供的值的电子邮件时,我还没有找到关于如何最好地处理清理的可靠指南。

默认情况下,我将发送纯文本消息,建议我不需要对这些值进行 HTML 编码。但是,我担心现代邮件客户端会尝试将任何看起来类似于 HTML as HTML。

我可以只对所有内容进行 HtmlEncode,但随后我们会考虑“公司名称”的输入,它可以非常合法地包含“&”符号,我不热衷于发送显示为“Father & Son Ltd.”的消息

【问题讨论】:

  • 我删除了最后一行以反对近距离投票(我不同意)。

标签: c# asp.net-mvc security xss


【解决方案1】:

所以,邮件中存在XSS是可能的,而且过去也发生过,但它被认为是邮件客户端的漏洞,与发件人无关。它几乎只发生在基于 Web 的电子邮件(如 gmail)中,而不是 Outlook 之类的电子邮件中。电子邮件客户端通常(也不应该)从电子邮件(尤其是桌面客户端)运行脚本。

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

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

【讨论】:

  • 从安全的角度来看,您的回答绝对正确。从声誉的角度来看(如果“声誉”甚至是一个词),我会确保我系统的用户不能将其用作攻击媒介,以攻击毫无戒心且未打补丁的旧客户端的用户。如果可以的话。
  • @LasseV.Karlsen 我可以看到这种观点。我想我更倾向于减少发送格式错误的电子邮件的机会(比如 OP 如何提到转义字符按原样呈现)。我认为在这种情况下,声誉损失仍将落在客户供应商身上。因为,就像我说的那样,恶意攻击者宁愿自己发送电子邮件,也不愿通过其他服务,因为他们的恶意工作流程可能会被破坏。
  • 声誉提升除外。如果您可以通过我的系统向我的用户发送电子邮件,我的用户可能会信任我而不是您,因此他们更有可能点击来自我的系统的电子邮件中的链接或任何内容如果它来自互联网上的某个奇怪的家伙。从技术的角度来看,据我所知,您的回答是中肯的(诚然,这并不意味着什么)。从“我会用这种思维方式来构建自己的系统”的角度来看,他**不。我会限制我的用户编写基本文本,最多使用 Markdown 呈现的内容,然后就这样。
【解决方案2】:

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

MailMessage mail = new MailMessage("you@yourcompany.com", "user@hotmail.com");
mail.IsBodyHtml = false;
...

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

因此,如果您要发送纯文本电子邮件,请不要对 HTML 值进行转义。

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

如果您最终发送了一封 HTML 正文的电子邮件,您将不希望整个模板为纯文本格式。您可能需要考虑using a Razor template,这将为您构建电子邮件的 HTML 提供更好的工具支持,并使基于模型的值默认为 HTML 编码:

@model WelcomEmailModel

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

<p>...

【讨论】:

    猜你喜欢
    • 2018-01-28
    • 1970-01-01
    • 2014-04-08
    • 2017-09-19
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    相关资源
    最近更新 更多