我在网站的中使用&
带有HTML5和UTF-8 的' '符号<title>
。Google会在其SERP上显示“&”号罚款,标题中的所有浏览器也一样。
http://validator.w3.org给了我这个:
&没有启动字符引用。(&可能应该以进行转义
&
。)
我真的需要做&
吗?
我不必为验证页面而对页面验证感到困惑,但我很好奇,希望听到人们对此的看法,以及它是否重要以及为什么。
我在网站的中使用&
带有HTML5和UTF-8 的' '符号<title>
。Google会在其SERP上显示“&”号罚款,标题中的所有浏览器也一样。
http://validator.w3.org给了我这个:
&没有启动字符引用。(&可能应该以进行转义
&
。)
我真的需要做&
吗?
我不必为验证页面而对页面验证感到困惑,但我很好奇,希望听到人们对此的看法,以及它是否重要以及为什么。
Answers:
是。就像错误所说的那样,在HTML中,属性是#PCDATA,表示它们已被解析。这意味着您可以在属性中使用字符实体。单独使用&
是错误的,如果不是宽松的浏览器,并且使用HTML而不是XHTML的事实会破坏解析。只要逃脱它&
,一切都会好起来的。
HTML5允许您不对其进行转义,但是仅当其后的数据看起来不像是有效的字符引用时。但是,最好不要使用该符号的所有实例,而不必担心应该是哪个实例,而不必担心哪个实例。
请记住这一点;如果您不转义&到&amp ;,对于您创建的数据来说已经很糟糕了(代码很可能是无效的),那么您也可能不会转义标签定界符,这对于用户提交的数据来说是一个巨大的问题,这很可能导致HTML和脚本注入,cookie窃取和其他攻击。
请转义您的代码。它将为您节省很多麻烦。
除了验证之外,事实仍然是编码某些字符对于HTML文档很重要,这样它就可以正确安全地呈现为网页。
编码&
为&
在任何情况下,对我来说,是生活,减少错误和失败的可能性更简单的规则。
比较以下内容:哪个更容易?哪个更容易打扰?
(请加一粒盐;))
volt & amp
amp&volt
volt&
??
amp&volt
是模棱两可的:&volt
现在是实体引用吗?
amp&volt
是不暧昧符号(按照定义在HTML规范)。参见mathiasbynens.be/notes/ambiguous-andsands和mothereff.in/ampersands#amp%26volt。
HTML5规则不同于HTML4。HTML5中不需要它-除非“&”号看起来像是一个参数名。例如,由于&copy;,“&copy = 2”仍然是个问题。是版权符号。
但是在我看来,根据以下文本来决定编码还是不编码比较困难。因此,最简单的途径可能是一直进行编码。
©=2
并不是您可能想到的那么大的问题。在属性值(例如href
属性)中,©
不会被视为的字符引用©
。在属性值之外,它将。
我认为这已经变成了一个更多的问题:“当浏览器不在乎时,为什么要遵循规范”。这是我的广义答案:
标准不是“现在”的事情。他们是“未来”的事情。如果我们作为开发人员遵循Web标准,那么浏览器供应商将更有可能正确实施这些标准,因此我们将向完全可互操作的Web靠拢,而CSS hack,功能检测和浏览器检测则是不必要的。我们不必弄清楚为什么在特定的浏览器中布局会中断,或者如何解决该问题。
具体来说,如果HTML5不需要使用&amp; 在您的特定情况下,并且您使用的是HTML5文档类型(并且还希望您的用户使用兼容HTML5的浏览器),那么就没有理由这样做了。
您能告诉我们您的title
实际身份吗?当我提交
<!DOCTYPE html>
<html>
<title>Dolce & Gabbana</title>
<body>
<p>am i allowed loose & mpersands?</p>
</body>
</html>
到http://validator.w3.org/ - 明确要求它使用实验HTML 5模式 -它没有对投诉&
小号...
<title>Dolce & Gabbana</title>
和<p>Dolce & Gabbana</p>
是有效的HTML 2.0。
在HTML中,a &
表示字符引用或实体引用的引用的开始。从这一点出发,解析器期望#
表示字符引用或表示实体引用的实体名称,后跟一个;
。这是正常现象。
但是,如果参考名称或只是参考开口&
后跟一个空格或其他分隔符喜欢"
,'
,<
,>
,&
,结束;
和甚至一个参考来表示一个普通的&
可省略:
<p title="&">foo & bar</p>
<p title="&">foo & bar</p>
<p title="&">foo & bar</p>
仅在这些情况下,才;
可以省略结尾甚至引用本身(至少在HTML 4中)。我认为HTML 5需要结尾;
。
但是规范建议始终使用诸如字符参考&
或实体参考之类的参考&
以避免混淆:
作者应使用“
&
”(ASCII十进制38)而不是“&
”,以避免与字符参考(实体参考开放分隔符)的开头混淆。&
由于在CDATA属性值中允许使用字符引用,因此作者也应在属性值中使用“ ”。
更新(2020年3月): W3C验证器不再抱怨转义URL。
我正在检查为什么需要转义图像URL,因此在https://validator.w3.org中尝试了它。解释很不错。它强调甚至URL也需要转义。[PS:我想由于URL的需要,它在被消耗时不会消失&
。有人可以澄清吗?]
<img alt="" src="foo?bar=qut&qux=fop" />
在文档中找到了实体引用,但没有定义该名称的引用。通常,这是由于拼写错误的参考名称,未编码的与号或省略尾随的分号(;)引起的。导致此错误的最常见原因是URL中的未编码的“&”号,如WDG在“ URL中的符号”中所述。实体引用以与号(&)开头,以分号(;)结尾。如果要在文档中使用文字“&”号,则必须将其编码为“&”(甚至在URL中!)。小心以分号结尾的实体引用,否则您的实体引用可能会与以下文本联系在一起进行解释。还请记住,命名实体引用区分大小写;&Aelig; 和æ是不同的字符。
&
启动实体引用。阅读后&qux
,解析器找不到最终的分号(;
),但遇到等号(=
),该等号不能是实体名称的一部分。如果解析器尝试非常严格(根据HTML 4),则这应该是解析错误。在HTML 5中,实体解析总体上更加轻松。
;
在查询字符串中使用分隔符(当您控制链接时)。
如果&
在html中使用,则应将其转义
如果&
用于javascript字符串(例如alert('This & that');
or或document.href),则无需使用它。
如果您使用document.write,则应使用它,例如 document.write(<p>this & that</p>)
document.write
应该避免。请参阅w3.org/html/wg/drafts/html/master/dom.html#document.write%28%29
document.write()
。但是,Alex从Script Stand到imo的总体观点是。+1
如果您真的在谈论静态文本
<title>Foo & Bar</title>
存储在硬盘上的某个文件中,然后由服务器直接提供服务,那么可以:它可能不需要转义。
但是,由于是非常小的HTML内容时下是完全静态的,我将添加下面的免责声明是假设HTML内容是从其他来源(数据库内容,用户输入的Web服务调用的结果,遗留API的结果产生。 ..):
如果您没有转义简单的&
,那么您也有可能也不会转义&
或
或<b>
或<script src="http://attacker.com/evil.js">
或任何其他无效文本。这意味着您充其量只能错误地显示您的内容,并且更有可能受到XSS攻击。
换句话说:当您已经检查并逃避了其他更成问题的案例时,几乎没有理由将尚未完全破损但仍然有些腥的单机和逃脱。
不知道这是否对任何人有用...我已经为此战斗了一段时间...这是一个光荣的正则表达式,您可以使用它来修复所有链接,javascript,内容。我不得不处理大量的遗留内容,没人想纠正。
将此添加到母版页或控件中的“渲染”替代中:
请不要因为将其放置在错误的位置而解雇我:
// remove the & from href="blaw?a=b&b=c" and replace with &
//in urls - this corrects any unencoded & not just those in URL's
// this match will also ignore any matches it finds within <script> blocks AND
// it will also ignore the matches where the link includes a javascript command like
// <a href="javascript:alert{'& & &'}">blaw</a>
html = Regex.Replace(html, "&(?!(?<=(?<outerquote>[\"'])javascript:(?>(?!\\k<outerquote>|[>]).)*)\\k<outerquote>?)(?!(?:[a-zA-Z][a-zA-Z0-9]*|#\\d+);)(?!(?>(?:(?!<script|\\/script>).)*)\\/script>)", "&", RegexOptions.Singleline | RegexOptions.IgnoreCase);
该链接提供了一个很好的示例,说明何时以及为什么您可能需要转义&
至&
https://jsfiddle.net/vh2h7usk/1/
有趣的是,我不得不对字符进行转义,以便在此处的答案中正确表示它。如果要使用内置的代码示例选项(从答案面板),我可以直接输入&
并按原样显示。但是,如果要手动使用该<code></code>
元素,则必须先转义才能正确表示它:)