Canonicalize() 函数将字符转换为白色 space
Canonicalize() function converts chars to white space
我正在使用 EncodeForHTML()
来防止跨站脚本 (XSS) 攻击。这样做时,一些文本字段为:
step 1: cost too much to keep. #3 bad business decision
在数据库中存储为:
step 2: cost too much to keep. 
#3&#4 bad business decision
然后我使用规范化来取回原始字符串:
#canonicalize(fieldName, false, false ,true)#
哪个应该 return 在上面的第 1 步中输入的内容。
但是,
显示为白色 space 字符。它几乎看起来像一个正方形。它发生在任何 &#
后跟一个数字。
这是 ColdFusion 2018。关于如何恢复默认设置的任何想法 #3
?
好的,让我们来看看这个:
为 HTML
编码 #3
#
变为 #
(十六进制实体)
3
变为 3
(无需编码)
&
变为 &
(命名实体)
#
变为 #
(十六进制实体)
4
变为 4
(无需编码)
Note: 

in your example is CarriageReturn and LineFeed, so basically there is a newline in front of #3
. We will ignore this for now.
为 HTML
解码 3&4
无论您使用decodeForHtml()
还是canonicalize()
:
#
变为 #
3
变为 3
&
变为 &
#
变为 #
4
变成 4
这是绝对正确的,这里没有问题。所以...
为什么我看到 □?
很简单:您正在 HTML.
中输出 解码值
如果您告诉浏览器将 #3
呈现为 HTML,浏览器将 "smart-detect" 一个不完整的实体。实体总是以 &
开头。这就是为什么您应该将实际的符号编码为 &
,以便浏览器将其识别为文字字符。现在大多数浏览器会自动检测 single/standalone &
并相应地对其进行编码。但是,在您的情况下,浏览器假定您的意思是说 
(缩写 
或 
),这是 control character EOT 并且无法打印,从而导致□.
解决方案
每当您想在 HTML 中显示某些内容时,您都必须对这些值进行编码。如果你需要在 ColdFusion 中检查一个变量,首选 <cfdump var="#value#">
(或 writeDump(value)
)而不是通过 <cfoutput>#value#</cfoutput>
(或 writeOutput(value)
)输出一个值。
演示
<cfset charsToEncode = [
"##", <!--- we have to escape # in ColdFusion by doubling it --->
"3",
"&",
"##", <!--- we have to escape # in ColdFusion by doubling it --->
"4"
]>
<h2>encodeForHtml</h2>
<cfloop array="#charsToEncode#" index="char">
<cfdump var="#encodeForHtml(char)#"><br>
</cfloop>
<cfset charsToDecode = [
"&##x23;", <!--- we have to escape # in ColdFusion by doubling it --->
"3",
"&",
"&##x23;", <!--- we have to escape # in ColdFusion by doubling it --->
"4"
]>
<h2>decodeForHtml</h2>
<cfloop array="#charsToDecode#" index="char">
<cfdump var="#decodeForHtml(char)#"><br>
</cfloop>
<h2>canonicalize</h2>
<cfloop array="#charsToDecode#" index="char">
<cfdump var="#canonicalize(char, false, false)#"><br>
</cfloop>
<h2>encoding the output PROPERLY</h2>
<cfoutput>#encodeForHtml("##3&##4")#</cfoutput><br>
<cfoutput>#encodeForHtml(decodeForHtml("&##x23;3&&##x23;4"))#</cfoutput><br>
Note: due to the mix of entities, canonicalize() has to guess the begin/end of each entity and is having issues with the ampersand here:<br>
<cfoutput>#encodeForHtml(canonicalize("&##x23;3&##x26;&##x23;4", false, false))#</cfoutput><br>
<h2>encoding the output INCORRECTLY</h2>
#3<br>
<cfoutput>#decodeForHtml("&##x23;3&&##x23;4")#</cfoutput><br>
<cfoutput>#canonicalize("&##x23;3&&##x23;4", false, false)#</cfoutput><br>
我正在使用 EncodeForHTML()
来防止跨站脚本 (XSS) 攻击。这样做时,一些文本字段为:
step 1: cost too much to keep. #3 bad business decision
在数据库中存储为:
step 2: cost too much to keep. 
#3&#4 bad business decision
然后我使用规范化来取回原始字符串:
#canonicalize(fieldName, false, false ,true)#
哪个应该 return 在上面的第 1 步中输入的内容。
但是,
显示为白色 space 字符。它几乎看起来像一个正方形。它发生在任何 &#
后跟一个数字。
这是 ColdFusion 2018。关于如何恢复默认设置的任何想法 #3
?
好的,让我们来看看这个:
为 HTML
编码#3
#
变为 #
(十六进制实体)
3
变为 3
(无需编码)
&
变为 &
(命名实体)
#
变为 #
(十六进制实体)
4
变为 4
(无需编码)
Note:


in your example is CarriageReturn and LineFeed, so basically there is a newline in front of#3
. We will ignore this for now.
为 HTML
解码3&4
无论您使用decodeForHtml()
还是canonicalize()
:
#
变为 #
3
变为 3
&
变为 &
#
变为 #
4
变成 4
这是绝对正确的,这里没有问题。所以...
为什么我看到 □?
很简单:您正在 HTML.
中输出 解码值如果您告诉浏览器将 #3
呈现为 HTML,浏览器将 "smart-detect" 一个不完整的实体。实体总是以 &
开头。这就是为什么您应该将实际的符号编码为 &
,以便浏览器将其识别为文字字符。现在大多数浏览器会自动检测 single/standalone &
并相应地对其进行编码。但是,在您的情况下,浏览器假定您的意思是说 
(缩写 
或 
),这是 control character EOT 并且无法打印,从而导致□.
解决方案
每当您想在 HTML 中显示某些内容时,您都必须对这些值进行编码。如果你需要在 ColdFusion 中检查一个变量,首选 <cfdump var="#value#">
(或 writeDump(value)
)而不是通过 <cfoutput>#value#</cfoutput>
(或 writeOutput(value)
)输出一个值。
演示
<cfset charsToEncode = [
"##", <!--- we have to escape # in ColdFusion by doubling it --->
"3",
"&",
"##", <!--- we have to escape # in ColdFusion by doubling it --->
"4"
]>
<h2>encodeForHtml</h2>
<cfloop array="#charsToEncode#" index="char">
<cfdump var="#encodeForHtml(char)#"><br>
</cfloop>
<cfset charsToDecode = [
"&##x23;", <!--- we have to escape # in ColdFusion by doubling it --->
"3",
"&",
"&##x23;", <!--- we have to escape # in ColdFusion by doubling it --->
"4"
]>
<h2>decodeForHtml</h2>
<cfloop array="#charsToDecode#" index="char">
<cfdump var="#decodeForHtml(char)#"><br>
</cfloop>
<h2>canonicalize</h2>
<cfloop array="#charsToDecode#" index="char">
<cfdump var="#canonicalize(char, false, false)#"><br>
</cfloop>
<h2>encoding the output PROPERLY</h2>
<cfoutput>#encodeForHtml("##3&##4")#</cfoutput><br>
<cfoutput>#encodeForHtml(decodeForHtml("&##x23;3&&##x23;4"))#</cfoutput><br>
Note: due to the mix of entities, canonicalize() has to guess the begin/end of each entity and is having issues with the ampersand here:<br>
<cfoutput>#encodeForHtml(canonicalize("&##x23;3&##x26;&##x23;4", false, false))#</cfoutput><br>
<h2>encoding the output INCORRECTLY</h2>
#3<br>
<cfoutput>#decodeForHtml("&##x23;3&&##x23;4")#</cfoutput><br>
<cfoutput>#canonicalize("&##x23;3&&##x23;4", false, false)#</cfoutput><br>