encodeForHtml()vs htmlEditFormat()

时间:2012-05-15 08:41:45

标签: coldfusion esapi coldfusion-10

encodeForHtml()(CF10中的新内容)与htmlEditFormat()相比,它们有何不同?

2 个答案:

答案 0 :(得分:9)

我认为它与java的OWASP ESAPI中的encodeForHTML函数相同。更安全,以避免XSS攻击使用HTML中的内容。

<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>

答案 1 :(得分:5)

EncodeFor *函数基于OWASP ESAPI库。主要区别在于HTMLEditFormat()仅用&<>替换“{0}},&amp;&lt;等”坏“字符串。 &gt;而EncodeForHTML()更聪明,其中一个优点是它可以识别已经编码的内容而不是对其进行双重编码。

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

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

HTMLEditFormat()和EncodeForHTML()都会正确地转义'&lt;'和'&gt;'字符。但是HTMLEditFormat()会盲目地对&进行编码,使得输出看起来像:

... how &amp;amp; rendered ...

使用encodeForHTML()时,它会是什么样子:

... how &amp; rendered ...

HTMLEditFormat()无法判断&符号已经编码,因此它再次重新编码。这是一个简单的例子,但它演示了ESAPI库如何更智能,因此更安全。

最重要的是,没有理由在CF10 +中使用HTMLEditFormat()。为了获得最大程度的保护,您应该使用Encode功能替换Format功能。

上面的完整示例和更多背景信息是http://www.isummation.com/blog/day-2-avoid-cross-site-scripting-xss-using-coldfusion-10-part-1/