Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
所有HTML转义上下文是什么?_Html_Escaping - Fatal编程技术网

所有HTML转义上下文是什么?

所有HTML转义上下文是什么?,html,escaping,Html,Escaping,输出HTML时,有几个不同的位置可以将文本解释为控制字符,而不是文本文本。例如,在“常规”文本中(即,在任何元素标记之外): 这是常规文本 以及在属性值内: <input value="this is value text"> 我相信,在HTML评论中: <!-- This text here might be programmatically generated and could, in theory, contain the double-hyphen chara

输出HTML时,有几个不同的位置可以将文本解释为控制字符,而不是文本文本。例如,在“常规”文本中(即,在任何元素标记之外):

这是常规文本
以及在属性值内:

<input value="this is value text">

我相信,在HTML评论中:

<!-- This text here might be programmatically generated
and could, in theory, contain the double-hyphen character
sequence, which is verboten inside comments -->

这三种文本中的每一种都有不同的规则,规定了必须如何转义才能将其视为非标记。所以我的第一个问题是,在HTML中是否有其他上下文可以将字符解释为标记/控制字符?上述上下文显然对需要转义的内容有不同的规则

第二个问题是,需要转义哪些规范的、全局安全的字符列表(对于每个上下文),以确保将任何嵌入的文本视为非标记?例如,理论上,您只需要在属性值中转义“和”,因为在属性值中,只有结束分隔符字符(“或”取决于属性值以哪个分隔符开头)具有控制意义。同样,在“常规”文本中,只有<和&具有控制意义。(我意识到并非所有的HTML解析器都是相同的。我最感兴趣的是,为了安抚符合规范的解析器,需要转义的最小字符集是多少。)

切向:以下文本将抛出HTML 4.01 Strict错误:

<a href="http://example.com/file.php?x=1&y=2">foo</a>

具体来说,它说它不知道实体“&y”应该是什么。但是,如果在&后面加一个空格,它的验证就可以了。但是,如果您正在动态生成该属性,您可能不想检查是否每次使用&都会导致验证错误,而只是转义所有&inside属性值

上述上下文显然对需要转义的内容有不同的规则

我不确定不同的元素是否有你所说的不同的编码规则。您列出的所有示例都需要HTML编码

例如

Fish&;炸薯条
最后一个示例包括一些对符号和的URL编码(&),在这一点上,事情变得棘手(将符号作为数据发送,这就是为什么必须对其进行编码)

所以我的第一个问题是,在HTML中是否有其他上下文可以将字符解释为标记/控制字符

在HTML文档中的任何地方,如果控制字符没有用作控制字符,则应该对它们进行编码(这是一个很好的经验法则)。大多数情况下,它是HTML编码,&或>等。其他情况下,当试图通过URL传递这些字符时,使用URL编码%20、%26等

第二个问题是,需要转义哪些规范的、全局安全的字符列表(对于每个上下文),以确保将任何嵌入的文本视为非标记

我要说的是,这本书有一些好的评论,可能值得一读——我想这本书也是一个好的观点。大多数语言都内置了将文本准备为安全HTML的函数,因此可能值得检查您选择的语言(如果您确实使用任何脚本语言,而不是手工编写HTML)

Wikipedia特别指出:“字符”和&用于分隔标记、属性值和字符引用。字符实体引用”和&;,它们是在HTML、XML和SGML中预定义的,可以用于字符的文字表示

对于URL编码


结束时的想法,我已经漫谈了一点:这完全排除了XML/XHTML的想法,它给球场带来了一个全新的游戏,它要求几乎所有的世界和它的狗都需要编码。如果您使用脚本语言并通过脚本语言写出变量,我敢肯定,找到内置函数或下载一个库将更容易:我希望这个答案的范围是确定的,没有遗漏要点或问题,也没有以错误的语调出现。:)
<div>This is regular text</div>
属性值:
&
必须转义。属性值分隔符
必须转义。如果未使用属性值分隔符(不要这样做),则无法转义

规范XML总是选择
作为分隔符,因此会将其转义。
字符不需要在属性值中转义,规范XML也不需要转义。HTML4规范建议对
>
进行编码,以实现向后兼容,但这只影响到一些真正古老而可怕的浏览器,现在没有人记得了;你可以忽略这一点


在XHTML
中,如果您正在寻找在web浏览器(包括HTML、JavaScript和样式表)中转义字符的最佳实践,那么Michael Coates的XSS预防备忘单可能就是您想要的。它包括对不同解释上下文的描述、指示如何在每个上下文中编码字符的表格以及代码示例(使用ESAPI)


注意
后面跟着
,顺便说一句,我意识到在HTML注释中没有--“转义序列”;它们只是被禁止的(因为注释被解析器忽略并且没有呈现,转义序列将没有任何作用)。如果出于某种原因,你确实需要包含一条评论,其中包括-,你要么需要将其剥去,要么用不那么冒犯的东西(例如U+2014 EM DASH)替换它。所以简单地说一下你的问题。他们有不同的逃避规则;您不需要在属性值中转义<,因为它在该属性值中没有控制功能
<h1>Fish &amp; Chips</h1>
<img alt="Awesome picture of Meat Pie &amp; Chips" />
<a href="products.aspx?type=1&amp;meal=fish%20%26%20chips&amp;page=1">Fish &amp; Chips</a>
<div>This is regular text</div>
<input value="this is value text">
<!-- This text here might be programmatically generated
and could, in theory, contain the double-hyphen character
sequence, which is verboten inside comments -->
The following text will throw errors as HTML 4.01 Strict:

<a href="http://example.com/file.php?x=1&y=2">foo</a>
If you put a space after the &, however, it validates just fine.