coldfusion - Canonicalize() 函数将字符转换为空格

标签 coldfusion canonicalization coldfusion-2018

我正在使用 EncodeForHTML() 来防止跨站脚本 (XSS) 攻击。这样做时,一些文本字段为:

step 1:   cost too much to keep. #3&#4 bad business decision

在数据库中存储为:

step 2:   cost too much to keep. 
#3&#4 bad business decision

然后我使用 canonicalize 取回原始字符串:

 #canonicalize(fieldName, false, false ,true)#

它应该返回上面步骤 1 中输入的内容。

但是, 显示为空白字符。它看起来几乎像一个正方形。对于任何后跟单个数字的 &# 都会发生这种情况。

这是 ColdFusion 2018。关于如何恢复默认的 #3 有什么想法吗?

最佳答案

好的,让我们来看看:

编码 #3&#4对于 HTML

#变成# (十六进制实体)
3变成3 (无需编码)
&变成& (命名实体)
#变成# (十六进制实体)
4变成4 (无需编码)

Note: 
 in your example is CarriageReturn and LineFeed, so basically there is a newline in front of #3&#4. We will ignore this for now.

解码3&4对于 HTML

无论您是否使用 decodeForHtml()canonicalize() :

#变成#
3变成3
&变成&
#变成#
4变成4

这是绝对正确的,这里没有问题。所以...

为什么我会看到□?

很简单:您正在 HTML 中输出解码值

如果您告诉浏览器渲染 #3&#4作为 HTML,浏览器将“智能检测”不完整的实体。实体始终以 & 开头。这就是为什么您应该将实际的 & 符号编码为 & ,因此浏览器将其识别为文字字符。现在大多数浏览器都会自动检测单个/独立&并将对其进行相应的编码。但是,在您的情况下,浏览器假设您想说  (缩写  ),即 control character EOT并且无法打印,结果为□。

解决方案

每当您想要以 HTML 形式显示某些内容时,您都必须对这些值进行编码。如果您需要检查 ColdFusion 中的变量,请首选 <cfdump var="#value#"> (或 writeDump(value) )而不是仅通过 <cfoutput>#value#</cfoutput> 输出值(或writeOutput(value))。

演示

https://cffiddle.org/app/file?filepath=6926a59a-f639-4100-b802-07a17ff79c53/5d545e2c-01a4-4c13-9f50-eb15777fba8c/6307a84e-89a3-411d-874f-7d32bd9a9874.cfm

<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",
    "&amp;",
    "&##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&amp;&##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&#4<br>
<cfoutput>#decodeForHtml("&##x23;3&amp;&##x23;4")#</cfoutput><br>
<cfoutput>#canonicalize("&##x23;3&amp;&##x23;4", false, false)#</cfoutput><br>

关于coldfusion - Canonicalize() 函数将字符转换为空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57499693/

相关文章:

coldfusion - 避免 cgi 共享范围

datetime - parseDateTime 输出差异

regex - ColdFusion , REGEX - 给定文本,查找 SPAN 中包含的所有项目

sql - 选择一列 DISTINCT SQL

css - 如何简化CSS代码

java - 我使用 Guava 的理想缓存

c# - 在 C# 中生成 XML 文档哈希

arrays - 从数据可能不存在的数组中获取元素

java - 如何在 Coldfusion8 中使用 javaloader 设置 java 库?

javascript - 如何将使用 charCodeAt 的 javascript 函数转换为 Coldfusion?