当用户在网站上注册时,我们是否应该在将值存储到数据库之前使用EncodeForHTML()
或EncodeForURL()
?
我之所以这样说是因为当我向包含电子邮件地址作为网址变量的网址的某人发送电子邮件时,我必须使用EncodeForURL()
。但是,如果此电子邮件地址已使用EncodeForHTML()
进行编码,则表示我必须再次使用Canonicalize(),然后再使用EncodeForURL()
。
因此,我认为EncodeForURL()
可能很好,但它是否安全'并且'纠正'什么时候将值存储在数据库中?
更新:在阅读文档时,它说EncodeForURL仅用于在URL中使用值。因此,似乎有意义的是我应该将其存储为EncodedForHTML,然后在URL上下文中使用它时对其进行Canonicalize和重新编码。我不知道所有这些编码会对我的服务器产生多大影响... ??
答案 0 :(得分:7)
从我公司的内部文档中复制此内容。由于想象被阻止@ work,不确定图像是否正确上传。如果是这样,我稍后会重新上传它们。我将来会将这个和更多相关内容发布到Githib仓库。
您应该将其存储为简单文本,但请确保在使用AntiSamy库的过程中清理数据。一旦数据安全,请确保使用正确的编码器在出路时对数据进行编码。仅供参考,encodeForHTML()
和encodeForHTMLAttribute()
的输出之间存在很大差异。
在下面的示例中,将定义电子邮件地址的变量替换为数据库中的数据。
PROTIP :请勿在CFFORM标记中使用这些编码器。这些标签会为您处理编码。 CF 9及以下使用HTMLEditFormat()
,CF 10及以上版本最有可能使用encodeForHTMLAttribute()
。
基本实现是包含一个电子邮件地址,以便填充新电子邮件窗口的“收件人”字段。
<cfset email = "someone@example.com" />
<a href="mailto:#email#">E-mail</a>
<a href="mailto:someone@example.com">E-mail</a>
<cfset email = "someone@example.com" />
<a href="mailto:#encodeForURL(email)#">E-mail</a>
请注意,“@”符号被正确地百分比编码为“%40”。
<a href="mailto:someone%40example.com">E-mail</a>
如果您打算在页面上显示电子邮件地址作为链接的一部分:
<cfset email = "someone@example.com" />
<a href="mailto:#encodeForURL(email)#">#encodeForHTML(email)#</a>
高级实施包括“收件人”和“收件人”的电子邮件地址。 “CC”。它还可以预先填充新电子邮件的正文和主题。
<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>
<a href="mailto:someone@example.com?cc=someone_else@example.com&subject=This is the subject&body=This is the body">E-mail</a>
请注意,主题和正文参数包含空格。虽然这个字符串在技术上可行,但它仍然容易受到攻击向量。
想象一下 body 的值是由数据库查询的结果设置的。此记录已被恶意用户“感染”,默认正文消息附加了“BCC”地址,因此某些恶意用户可以获取通过此链接发送的电子邮件副本。
<cfset body = "This is the body&bcc=someone@evil.com" />
<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>
为了阻止此MAILTO链接被感染,需要对此字符串进行正确编码。
因为“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>
<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>
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>
注意这些关于URL编码器的事情:
<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>
加号是什么?单个邮件客户端(例如Outlook,GMail等)可以正确解码这些URL编码值。
答案 1 :(得分:1)
以纯文本格式存储电子邮件地址,然后在使用时对其进行编码,具体取决于上下文。如果它将成为URL的一部分,请使用EncodeForURL()
。如果它将以HTML格式显示为文本,请使用EncodeForHtml()
。