Coldfusion encodeForHtml()与htmlEditFormat()的比较

Coldfusion encodeForHtml()与htmlEditFormat()的比较,coldfusion,esapi,coldfusion-10,Coldfusion,Esapi,Coldfusion 10,encodeForHtml()(CF10中新增)与htmlEditFormat(),它们有什么不同?我认为这与java的OWASP ESAPI中的encodeForHtml函数相同。在HTML中使用内容可以更安全地避免XSS攻击 <cfsavecontent variable="htmlcontent"> <html> <head> <script>function hello() {alert('hello')}</

encodeForHtml()
(CF10中新增)与
htmlEditFormat()
,它们有什么不同?

我认为这与java的OWASP ESAPI中的encodeForHtml函数相同。在HTML中使用内容可以更安全地避免XSS攻击

<cfsavecontent variable="htmlcontent">
<html>
    <head>
        <script>function hello() {alert('hello')}</script>
    </head>
    <body>
        <a href="#bookmark">Book Mark &amp; Anchor</a><br/>
        <div class="xyz">Div contains & here.</div>
        <IMG     SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#    x27&#x58&#x53&#x53&#x27&#x29>
    <IMG SRC=&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041>
</body>
</html></cfsavecontent>

<cfoutput>#htmleditformat(htmlcontent)#</cfoutput>
<br />
<cfoutput>#encodeforhtml(htmlcontent)#</cfoutput>

函数hello(){alert('hello')}

Div包含&在这里。 #htmleditformat(htmlcontent)#
#encodeforhtml(htmlcontent)#
EncodeFor*函数基于OWASP ESAPI库。主要区别在于HTMLEditFormat()仅用好字符串替换“坏”字符串,如
&
,如
&
而EncodeForHTML()更智能,一个优点是它可以识别已编码的内容,而不是对其进行双重编码

例如,如果用户向您的站点提交了以下内容:

<div>
Here is <i>test</i> html content includes<br/>
<script>alert('hello')</script>
Notice how &amp; rendered with both functions.
</div>

以下是测试html内容包括的内容
警报(“你好”) 注意如何&;使用这两个函数进行渲染。
HTMLEditFormat()和EncodeForHTML()都将正确转义“”字符。但是HTMLEditFormat()会再次盲目地对
&
进行编码,从而使您的输出看起来像:

。。。如何及;amp;渲染…

如果使用encodeForHTML(),则会出现以下情况:

。。。如何及;渲染…

HTMLEditFormat()无法确定符号已编码,因此它再次对其进行了编码。这是一个微不足道的示例,但它演示了ESAPI库如何更智能,从而更安全

总之,没有理由在CF10+中使用HTMLEditFormat()。为了获得最大的保护,您应该将格式化函数替换为编码函数


上面的完整示例和更多背景都在总结中:

似乎很奇怪,他们不只是通过另一个属性来增强预先存在的标记以使其更安全,或者只是简单地对其进行开箱即用的增强。encodeForHtml()是集合的一部分:encodeForCss()、encodeForJavascript()、encodeForHtmlAttribute(),等等。它还应该转义比原来的htmlEditFormat()更多的内容。因为它们使用不同的输出,所以它们添加了一个新标记作为上述集合的一部分,而不是修改现有标记。这有助于保持与现有代码的向后兼容性。我认为,如果您有多个函数(先提到这些HTML函数,然后是两个JS函数),乍看起来似乎做的是相同的事情,但实际上它们没有做,那么语言也会变得混乱。这让我想知道在什么时候我应该有一个有效的理由来使用HTMLEditFormat()而不是EncodeForHTML()?当10还处于测试阶段时,我仔细阅读了文档,这个问题进入了我的脑海,并一直潜伏在那里。我越想这一点,我认为最让我困扰的是,为什么旧函数没有特别标记为不推荐。对我来说,这只是意味着在新的开发过程中,旧功能的一些用法比总是使用新功能的用法要多。