Do I encode ampersands in ?
我正在编写自动生成HTML的代码,并且希望它正确编码。
假设我正在生成指向以下URL的链接:
1
| http://www.google.com/search?rls=en&q=stack+overflow |
我假设所有属性值都应进行HTML编码。 (如果我写错了,请纠正我。)这意味着,如果将上述URL放入锚标记中,则应将&编码为&,如下所示:
那是对的吗?
-
可能重复哪些字符使URL无效?
-
@CiroSantilli:关于实际的URL字符串; 这是关于它们在HTML属性中出现时的编码方式。
是的。 HTML实体在HTML属性中进行了解析,并且流浪&会造成歧义。这就是为什么您应该始终在所有HTML属性中编写&而不是仅仅写&的原因。
就是说,仅需对&和引号进行编码。如果属性中有特殊字符,例如é,则无需编码即可满足HTML解析器的要求。
过去,URL需要使用非ASCII字符(例如é)进行特殊处理。您必须使用百分比转义对它们进行编码,在这种情况下,它将给出%C3%A9,因为它们是由RFC 1738定义的。但是,RFC 1738已由RFC 3986(URI,统一资源标识符)和RFC 3987( IRI,国际化资源标识符),WhatWG以此为基础来定义浏览器在看到自HTML5以来包含非ASCII字符的URL时的行为。因此,现在可以安全地在URL中包含非ASCII字符,无论是否经过百分比编码。
-
我对此非常确定,但是我有一个难得的疑问时刻。感谢您的确认。
-
您还可以将空格编码为" +"而不是%20-这使URL易于阅读。
-
目前,在本机iPhone邮件客户端的mailto链接中,+尚不被尊重。
-
仍需要编码:stackoverflow.com/questions/2742852/unicode-characters-in-urls
-
@lulalala,我很想听听您对此的看法。我是法语用户,并且在少数URL中一直使用法语字符(包括),并且假设网页具有正确的编码,但我对此没有任何疑问。继承人之一,您可以检查源以验证Stack Overflow尚未对其进行编码:fr.wikipedia.org/wiki/Allgorie_de_la_caverne
-
@zneak当我看到源代码时,虽然它被编码为&#233。我想了解的是,像&一样,Unicode字符也应该在URL中进行编码。
-
@lulala,我相信那时候我们俩都错了。正如您所说,Stack Exchange将更改为&#233,但是HTML实体在解析时被解析。我正在使用DOM检查器,这就是为什么它显示的原因。如您所正确指出的那样,URL只能包含US-ASCII字符。但是,在这种情况下使用HTML实体而不是百分比编码仍会导致技术上无效的URL。这是因为URL定义,而不是因为HTML解析器。相应地修改答案。
-
@zneak其实您是对的(HTML实体在解析时已解析)。感谢您提供的信息非常丰富!
-
@lulalala,我认识的聪明人指出,当前的HTML标准使用URL来表示URI或IRI。 IRI仅存在以允许UTF-8序列。
-
我要补充一下(因为我刚刚陷入这个错误),如果您依赖模板引擎,则应检查它是否自动处理转义HTML实体。在我的情况下,Twig正在这样做,而我错误地两次转义了将&写入标签属性,而不是直接使用&。
根据当前的官方HTML建议,必须将"&"号转义,例如在这样的上下文中为&。但是,浏览器不需要它,HTML5 CR建议将此规则作为规则,以便特殊规则适用于属性值。在这方面,当前的HTML5验证器已经过时了(请参阅带有注释的错误报告)。
仍然可以转义属性值中的"&"号,但是除了使用当前工具进行验证外,实际上没有必要在href值中对它们进行转义(如果开始转义,则存在犯错误的小风险)。
-
不过,XHTML(以applicationxhtml+xml形式发送的实际XHTML)很可能总是需要它。
-
对于这一更改的一个警告,仍在讨论,辩论和误解中,只要&现在应该是可以的,只要它是"明确的"即可。使"&"符号变得模棱两可的一种明显方法是,首先使用非空格字符,然后使用分号。该&符现在是模棱两可的,并且会导致解析错误。
-
正如Jukka所说,对所有"&"号进行编码肯定存在风险,因此请考虑您的href网址之一包含分号的可能性。不太可能,因为我不确定我是否见过带有分号的网址。不是说它不能完成。因此,实际上,我认为我们对&的使用不太可能是模棱两可的。因此,我们将继续使用未经编码的href属性。
-
逃避是必要的全部原因恰恰是因为存在歧义的可能性。这个特定问题可能不是在99.99%的时间内都引入XSS攻击向量,渲染效果不好或没有任何影响,但这并不是不打扰的原因。正确地进行转义很困难,并且总是存在犯错误的可能性。
我发布了一个新的答案,因为我发现zneak的答案没有足够的示例,没有将HTML和URI处理显示为不同的方面和标准,并且缺少一些小东西。
您有两个关于链接中URL的标准().
The first standard is RFC 1866 (HTML 2.0) where in"3.2.1. Data Characters" you can read the characters which need to be escaped when used as the value for an HTML attribute. (Attributes themselves do not allow special characters at all, e.g. is not allowed, nor is .)
Later this has gone into the HTML 4 standard, the characters you need to escape are:
The other standard is RFC 3986"Generic URI standard", where URLs are handled (this happens when the browser is about to follow a link because the user clicked on the HTML element).
It is important to escape those characters so the client knows wether they represent data or a delimiter.
Example unescaped:
Example, fully legit URL
Example fully legit URL in value of HTML attribute:
Also important scenarios:
是的,您应该将&转换为&。
W3C的这个html验证器工具对于此类问题很有帮助。它将告诉您特定页面的错误和警告。
-
我不确定W3C验证程序是否将此错误(href中未转义的&)检测为错误。
-
当前,W3C验证器接受未转义的&为有效。这是否意味着标准已更改且不再需要编码? (在这里做出大多数答案已过时)?如果是这样,这仅适用于href或任何属性吗?