gpt4 book ai didi

coldfusion - 编码电子邮件地址 : EncodeForHTML or EncodeForURL

转载 作者:行者123 更新时间:2023-12-02 06:16:29 24 4
gpt4 key购买 nike

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

我问这个的原因是,当我向某人发送一封电子邮件,其中包含一个包含电子邮件地址作为 URL 变量的 URL 时,我必须使用 EncodeForURL()。但是,如果此电子邮件地址已经使用 EncodeForHTML() 进行了编码,则意味着我必须先对其进行 Canonicalize(),然后再对其使用 EncodeForURL()

因此我认为 EncodeForURL() 可能不错,但是在将值存储在数据库中时它是否“安全”和“正确”?

更新:阅读文档后,它说 EncodeForURL 仅用于在 URL 中使用值。因此,我应该将其存储为 EncodedForHTML,但随后在 URL 上下文中使用它时对 URL 进行规范化和重新编码似乎是有道理的。我不知道所有这些编码会对我的服务器造成多大的性能影响...??

最佳答案

从我公司的内部文档中复制这个。不确定图像是否正确上传,因为 imagr 被阻止@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>

攻击向量

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

没有编码的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

请注意 subjectbody 参数包含空格。虽然这个字符串在技术上是可行的,但它仍然容易受到攻击向量的攻击。<​​/p>

假设 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”是 标签的一个属性,您可能会考虑使用 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. 对“body”参数进行编码时,它包含恶意注入(inject)的“&body=”字符串。整个字符串现在是邮件正文的一部分,这可以防止电子邮件中出现意外的“密件抄送”。

<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

加号有什么用?正确解码这些 URL 编码值取决于各个邮件客户端(例如 Outlook、GMail 等)。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com