哪一个是正确的?
<img src="#encodeForHTMLAttribute(FORM.path)#">
或
<img src="#encodeForURL(FORM.path)#">
或
<img src="#encodeForHTMLAttribute(encodeForURL(FORM.path))#">
答案 0 :(得分:7)
使用与插入需要编码的文本的上下文匹配的方法。
encodeForUrl 用于将动态文本放入网址 - 因此它会将/
替换为%2F
(and so on),如果您将其应用于整个网址,你将有一个编码的URL(因此在src属性中被破坏)。
如果您允许用户提供部分网址,则需要拆分/
(以及任何其他相关分隔符),在每个部分上应用encodeForUrl,然后重新加入。
注意: encodeForUrl似乎将其字符串直接传递给Java,这意味着反斜杠被视为转义字符 - \b\n
编码为%08%0A
而不是{{ 1}} - 此行为不是标准URL编码的一部分(通常也不是CF字符串)。为避免这种情况,请使用UrlEncodedFormat函数。
encodeForHTMLAttribute 用于将动态文本放入HTML属性中 - 其目的是确保将内容视为文本(未解析为HTML) - 它不知道/关心其内容是否为一个URL或其他东西。
总结,对于这种情况,您可能需要%5Cb%5Cn
。
答案 1 :(得分:1)
在你的例子中,答案是使用两者。
但是,根据FORM.path
的内容,您可能会破坏事物。
函数encodeForURL
应该被称为encodeUriComponent
(as is done in Javascript),因为它旨在用于uri组件,而不是整个url字符串。 uri组件(例如名称值对)需要单独编码,否则分隔符(&#34; =&#34;对于名称值对)也将被编码。
即使您有index.cfm
文件,以下内容也会产生404。请注意路径分隔符&#34; /&#34;,查询字符串分隔符&#34;?&#34;和名称/值分隔符&#34; =&#34;都被编码,使整个字符串成为一个单元。
<a href="#encodeForURL("/index.cfm?x=y")#">here</a>
应该做的是:
<cfset pathURIEncoded = "/index.cfm?#encodeForURL("x")#=#encodeForURL("y")#">
<a href="#encodeForHTMLAttribute(Variables.pathURIEncoded)#">here</a>
当然,用变量而不是静态字符串替换x
和y
。
答案 2 :(得分:0)
对于这个例子,我会使用encodeForHTMLAttribute方法,因为它是一个静态路径。 唯一的例外是src属性本身的值是从公共可访问的范围(通过URL,FORM等发送)生成的,并且包含动态数据。如果是这种情况,我会使用encodeForURL()方法。