在HTML中,
<a HREF="http://...... & .... ">Dust & Bones</a>
needs to be escaped as follows:
<a href="http://...... & .... ">Dust & Bones</a>
需要应用&
的范围是什么。它只是href还是HTML文本中的任何地方?
<input value="http://... & ">?
或
内<script>... & ... </script>
这些需要逃避吗?
更新
更大的问题,可以解释这一点,HTML解析器何时查找&amp; XXX;代币并替换它们?它是在整个文档中完成一次,还是对标记内的标记与属性值之间的文本应用不同的规则与wihtin tagA相对于tagB内部 - 不同的解析规则似乎适用于内部,因此我可以编写&amp; &安培; (对于AND)和&lt;为(少)。那么,哪些规则适用于哪个范围?
答案 0 :(得分:2)
规则因您正在处理的HTML版本而异,但总是更复杂,值得尝试记住。
安全的方法是“使用字符引用来代表除了内部脚本和样式元素之外的所有地方的5个HTML特殊字符”,这使得除了XHTML之外的所有内容都是安全的。
对于XHTML,规则与“并在脚本和样式元素中使用显式CDATA部分”的附加条件相同。
更大的问题可以解释这个问题,HTML解析器何时查找
&XXX;
令牌并替换它们?
因为它解析HTML(取决于令牌器的当前状态(“内部开始标记”和“内部属性值”是不同状态的示例))。
是否在整个文件中完成了一次
除非您触发其他HTML解析(例如,通过在元素上设置innerHTML
)。
或不同的规则适用于代码中的代码与属性值之间的文本与wihtin tagA和tagB内的属性值
不同的规则适用于不同的地方。完整的当前规则(正如我在评论中所建议的那样)相当复杂,需要从HTML 5 parsing rules中提取大量工作。这就是为什么我建议,如果您是HTML作者而不是浏览器作者,使用更简单的规则“使用字符引用,除非您在脚本或样式元素中”。
- 不同的解析规则似乎适用于
<script>
,因此我可以为{LESS-THAN}编写&&
(对于AND)和<
。那么,哪些规则适用于哪个范围?
在HTML 4术语中,script
和style
元素被定义为包含CDATA(其中HTML中具有特殊含义的唯一字符序列是</
,它终止了CDATA部分)。文档中的其他任何位置(包括,反直觉地,定义为包含CDATA的属性值)&
表示字符引用的开始(尽管可能存在一些基于{{之后的字符)的例外情况。 1}}是)。
HTML 5规则更复杂,但基本原则是“使用&
,&
,<
,>
的字符引用是安全和理智的和"
除了脚本和样式元素之外的所有地方“持有。