esapi:对于src属性,我们应该使用encodeForHTMLAttribute吗?encodeForURL?或两者?

Hen*_*nry 4 xss coldfusion esapi coldfusion-10

哪一个是正确的?

<img src="#encodeForHTMLAttribute(FORM.path)#">
Run Code Online (Sandbox Code Playgroud)

要么

<img src="#encodeForURL(FORM.path)#">
Run Code Online (Sandbox Code Playgroud)

要么

<img src="#encodeForHTMLAttribute(encodeForURL(FORM.path))#">
Run Code Online (Sandbox Code Playgroud)

Pet*_*ton 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 ) )这种情况.

  • 正确.这通常意味着您对从当前网址获取的任何参数进行网址编码,然后html属性对整个网址进行编码. (2认同)