编码电子邮件地址:EncodeForHTML或EncodeForURL

时间:2015-04-07 20:49:53

标签: coldfusion coldfusion-10 coldfusion-11

当用户在网站上注册时,我们是否应该在将值存储到数据库之前使用EncodeForHTML()EncodeForURL()

我之所以这样说是因为当我向包含电子邮件地址作为网址变量的网址的某人发送电子邮件时,我必须使用EncodeForURL()。但是,如果此电子邮件地址已使用EncodeForHTML()进行编码,则表示我必须再次使用Canonicalize(),然后再使用EncodeForURL()

因此,我认为EncodeForURL()可能很好,但它是否安全'并且'纠正'什么时候将值存储在数据库中?

更新:在阅读文档时,它说EncodeForURL仅用于在URL中使用值。因此,似乎有意义的是我应该将其存储为EncodedForHTML,然后在URL上下文中使用它时对其进行Canonicalize和重新编码。我不知道所有这些编码会对我的服务器产生多大影响... ??

2 个答案:

答案 0 :(得分:7)

从我公司的内部文档中复制此内容。由于想象被阻止@ work,不确定图像是否正确上传。如果是这样,我稍后会重新上传它们。我将来会将这个和更多相关内容发布到Githib仓库。


您应该将其存储为简单文本,但请确保在使用AntiSamy库的过程中清理数据。一旦数据安全,请确保使用正确的编码器在出路时对数据进行编码。仅供参考,encodeForHTML()encodeForHTMLAttribute()的输出之间存在很大差异。

在下面的示例中,将定义电子邮件地址的变量替换为数据库中的数据。


PROTIP :请勿在CFFORM标记中使用这些编码器。这些标签会为您处理编码。 CF 9及以下使用HTMLEditFormat(),CF 10及以上版本最有可能使用encodeForHTMLAttribute()


简单实施

基本实现是包含一个电子邮件地址,以便填充新电子邮件窗口的“收件人”字段。

CFML

<cfset email = "someone@example.com" />
<a href="mailto:#email#">E-mail</a>

HTML输出

<a href="mailto:someone@example.com">E-mail</a>

具有适当编码的CFML

<cfset email = "someone@example.com" />
<a href="mailto:#encodeForURL(email)#">E-mail</a>

编码的HTML输出

请注意,“@”符号被正确地百分比编码为“%40”。

<a href="mailto:someone%40example.com">E-mail</a>

点击时的结果

Simple Implementation Results when clicked.

如果您打算在页面上显示电子邮件地址作为链接的一部分:

<cfset email = "someone@example.com" />
<a href="mailto:#encodeForURL(email)#">#encodeForHTML(email)#</a>

攻击矢量

高级实施包括“收件人”和“收件人”的电子邮件地址。 “CC”。它还可以预先填充新电子邮件的正文主题

无编码的CFML

<cfset email = "someone@example.com" />
<cfset email_cc = "someone_else@example.com" />
<cfset subject = "This is the subject" />
<cfset body = "This is the body" />
<a href="mailto:#email#?cc=#email_cc#&subject=#subject#&body=#body#">E-mail</a>

HTML输出

<a href="mailto:someone@example.com?cc=someone_else@example.com&subject=This is the subject&body=This is the body">E-mail</a>

点击时的结果

enter image description here

请注意,主题正文参数包含空格。虽然这个字符串在技术上可行,但它仍然容易受到攻击向量。

想象一下 body 的值是由数据库查询的结果设置的。此记录已被恶意用户“感染”,默认正文消息附加了“BCC”地址,因此某些恶意用户可以获取通过此链接发送的电子邮件副本。

受感染数据

<cfset body = "This is the body&bcc=someone@evil.com" />

HTML输出

<a href="mailto:someone@example.com?cc=someone_else@example.com&subject=This is the subject&body=This is the body&bcc=someone@evil.com">E-mail</a>

点击时的结果

enter image description here

 为了阻止此MAILTO链接被感染,需要对此字符串进行正确编码。

带有HTML属性编码的CFML

因为“href”是&lt; a&gt;的属性。您可以考虑使用HTML属性编码器。 这是不正确的。

<cfset email = "someone@example.com" />
<cfset email_cc = "someone_else@example.com" />
<cfset subject = "This is the subject" />
<cfset body = "This is the body&bcc=someone@evil.com" />
<a href="mailto:#encodeForHTMLAttribute(email)#?cc=#encodeForHTMLAttribute(email_cc)#&subject=#encodeForHTMLAttribute(subject)#&body=#encodeForHTMLAttribute(body)#">E-mail</a>

HTML输出

<a href="mailto:someone&#x40;example.com?cc=someone_else&#x40;example.com&subject=This&#x20;is&#x20;the&#x20;subject&body=This&#x20;is&#x20;the&#x20;body&amp;bcc&#x3d;someone&#x40;evil.com">E-mail</a>

点击时的结果

enter image description here

带URL编码的CFML

MAILTO链接的正确编码是使用URL编码器完成的。

<cfset email = "someone@example.com" />
<cfset email_cc = "someone_else@example.com" />
<cfset subject = "This is the subject" />
<cfset body = "This is the body&bcc=someone@evil.com" />
<a href="mailto:#encodeForURL(email)#?cc=#encodeForURL(email_cc)#&subject=#encodeForURL(subject)#&body=#encodeForURL(body)#">E-mail</a>

具有正确编码的HTML输出

注意这些关于URL编码器的事情:

        
  1. 每个空格(“”)都会转换为加号(“+”),而不是预期的百分比值(“%20”)。
  2.     
  3. 使用百分比(“%”)值进行编码。
  4.     
  5. 由于各个查询参数都已编码,因此连接每个参数的&符号(“&amp;”)未编码。
  6.     
  7. 当编码“body”参数时,它包含恶意注入的“&amp; body =”字符串。整个字符串现在是邮件正文的一部分,它可以防止电子邮件的意外“密件抄送”。
  8. <a href="mailto:someone%40example.com?cc=someone_else%40example.com&subject=This+is+the+subject&body=This+is+the+body%26bcc%3Dsomeone%40evil.com">E-mail</a>

    点击时的结果

    enter image description here

    加号是什么?单个邮件客户端(例如Outlook,GMail等)可以正确解码这些URL编码值。

答案 1 :(得分:1)

以纯文本格式存储电子邮件地址,然后在使用时对其进行编码,具体取决于上下文。如果它将成为URL的一部分,请使用EncodeForURL()。如果它将以HTML格式显示为文本,请使用EncodeForHtml()