哪个是正确的?
<img src="#encodeForHTMLAttribute(FORM.path)#">
或者
<img src="#encodeForURL(FORM.path)#">
或者
<img src="#encodeForHTMLAttribute(encodeForURL(FORM.path))#">
?
哪个是正确的?
<img src="#encodeForHTMLAttribute(FORM.path)#">
或者
<img src="#encodeForURL(FORM.path)#">
或者
<img src="#encodeForHTMLAttribute(encodeForURL(FORM.path))#">
?
使用与您插入需要编码的文本的上下文相匹配的方法。
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 ) )
针对这种情况。
在您的示例中,答案是同时使用两者。
但是,根据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>
当然,用变量而不是静态字符串替换x
and 。y
对于此示例,我将使用 encodeForHTMLAttribute 方法,因为它是静态路径。唯一的例外是 src 属性本身的值是从可公开访问的范围(通过 URL、FORM 等发送)生成并包含动态数据。如果是这种情况,我会使用 encodeForURL() 方法。