4

哪个是正确的?

<img src="#encodeForHTMLAttribute(FORM.path)#">

或者

<img src="#encodeForURL(FORM.path)#">

或者

<img src="#encodeForHTMLAttribute(encodeForURL(FORM.path))#">

?

4

3 回答 3

7

使用与您插入需要编码的文本的上下文相匹配的方法。


encodeForUrl用于将动态文本放入 URL - 因此它将替换/%2F(等等),如果将其应用于整个 URL,您将拥有一个编码的 URL(因此在 src 属性中使用时会被破坏)。

如果您允许用户提供部分 URL,则需要拆分/(以及任何其他相关的分隔符),在每个部分上应用 encodeForUrl,然后重新组合在一起。

注意: encodeForUrl 似乎将其字符串直接传递给 Java,这意味着反斜杠被视为转义字符 -\b\n编码为%08%0A而不是%5Cb%5Cn- 这种行为不是标准 URL 编码的一部分(通常也不是 CF 字符串)。为避免这种情况,请改用 UrlEncodedFormat 函数。

encodeForHTMLAttribute用于将动态文本放入 HTML 属性 - 其目的是确保内容被视为文本(不解析为 HTML) - 它不知道/关心其内容是 URL 还是其他内容。


总而言之,您可能希望encodeForHtmlAttribute( UrlEncodedFormat( Form.Path ) )针对这种情况。

于 2012-10-16T22:01:34.793 回答
1

在您的示例中,答案是同时使用两者。

但是,根据FORM.path您的内容,可能会破坏事物。

encodeForURL应该调用该函数encodeUriComponent就像在 Javascript 中所做的那样),因为它旨在用于 uri 组件,而不是整个 url 字符串。uri 组件,例如名称值对,需要单独编码,否则分隔符(名称值对的“=”)也将被编码。

即使您有index.cfm文件,以下也会导致 404。注意路径分隔符“/”,查询字符串分隔符“?” 和名称/值分隔符“=”都被编码,使整个字符串成为一个单元。

<a href="#encodeForURL("/index.cfm?x=y")#">here</a>

应该做的是:

<cfset pathURIEncoded = "/index.cfm?#encodeForURL("x")#=#encodeForURL("y")#">
<a href="#encodeForHTMLAttribute(Variables.pathURIEncoded)#">here</a>

当然,用变量而不是静态字符串替换xand 。y

于 2012-10-16T22:06:09.197 回答
0

对于此示例,我将使用 encodeForHTMLAttribute 方法,因为它是静态路径。唯一的例外是 src 属性本身的值是从可公开访问的范围(通过 URL、FORM 等发送)生成并包含动态数据。如果是这种情况,我会使用 encodeForURL() 方法。

于 2012-10-16T21:39:23.033 回答