它们是否与XML相同,也许还要加上空格( )?
我发现的HTML转义字符一些大名单,但我不认为他们 必须 进行转义。我想知道 需要 逃避什么。
如果你在文本内容预期的位置在文档中插入文本内容1,你通常只需要,你会在XML逃脱相同的字符。在元素内部,这仅包括实体转义&与号和元素定界符小于和大于符号< >:
&
<
>
& becomes & < becomes < > becomes >
在属性值内部,还必须转义使用的引号字符:
" becomes " ' becomes '
在某些情况下,跳过这些字符中的某些字符可能是安全的,但是我建议您在所有情况下都跳过所有五个字符,以减少犯错的可能性。
如果您的文档编码不支持您正在使用的所有字符,例如您尝试在ASCII编码的文档中使用表情符号,则还需要转义这些字符。如今,大多数文档都使用完全支持Unicode的UTF-8编码进行编码,而无需这样做。
通常,您不应将空格转义为 。 不是正常的空间,而是一个不间断的空间。您可以使用这些空格代替常规空格,以防止在两个单词之间插入换行符,或者在不自动折叠的情况下插入多余的空格,但这通常是很少见的。除非您有一个设计约束,否则请不要这样做。
1所谓“期望文本内容的位置”,是指在其中包含适用常规解析规则的元素或带引号的属性值内。例如:<p>HERE</p>或<p title="HERE">...</p>。我上面写的内容 不适 用于具有特殊解析规则或含义的内容,例如脚本或样式标签内部,或作为元素或属性名称。例如:<NOT-HERE>...</NOT- HERE>,<script>NOT-HERE</script>,<style>NOT-HERE</script>,或<p NOT-HERE="...">...</p>。
<p>HERE</p>
<p title="HERE">...</p>
<NOT-HERE>...</NOT- HERE>
<script>NOT-HERE</script>
<style>NOT-HERE</script>
<p NOT-HERE="...">...</p>
在这些情况下,规则更复杂,并且引入安全漏洞要容易得多。 我强烈建议您不要在任何这些位置插入动态内容。 我已经看到有能力的,具有安全意识的开发人员团队通过假设他们已经正确编码了这些值而忽略了边缘情况,从而引入了漏洞。通常有一个更安全的选择,例如将动态值放入属性中,然后使用JavaScript处理它。
如果需要,请阅读开放式Web应用程序安全项目的XSS预防规则,以帮助您理解一些需要牢记的问题。