encodeForHtml()vs htmlEditFormat()

Hen*_*nry 9 coldfusion esapi coldfusion-10

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

Pri*_*tel 10

我认为它与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>
Run Code Online (Sandbox Code Playgroud)

  • 我想的越多,我认为最困扰我的是为什么旧功能没有被特别标记为弃用.它只是向我暗示,在新开发期间,总是使用较新的功能,可以看到旧版本的一些用法. (6认同)
  • 由于它们使用不同的输出,因此它们添加了新标签作为前述集合的一部分,而不是修改现有标签.这有助于保持与现有代码的向后兼容性. (4认同)
  • 好吧,encodeForHtml()是一个集合的一部分:encodeForCss(),encodeForJavascript(),encodeForHtmlAttribute()等.它也应该比原来的htmlEditFormat()更多地逃脱. (3认同)
  • 看起来奇怪的是,他们不仅会通过其他属性增强预先存在的标签,以使其更安全,或者只是简单地将其开箱即用. (2认同)
  • 我认为当你有多个函数时(这些HTML提到然后是两个JS的函数),它们也会面临混乱语言的风险,乍一看似乎做同样的事情,但事实上它们并没有.它让我想知道在什么时候我应该有一个有效的理由在EncodeForHTML()上使用HTMLEditFormat()?当10还在测试阶段时,我通读了文档,这个问题进入了我的脑海,并一直潜伏在那里. (2认同)

Bri*_*lli 5

EncodeFor*函数基于OWASP ESAPI库.主要的区别是,HTMLEditFormat()仅仅是替代"坏"的字符串,像&,<>具有良好的字符串,如&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>
Run Code Online (Sandbox Code Playgroud)

HTMLEditFormat()和EncodeForHTML()都可以正确地转义'<'和'>'字符.但是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/