问题 如何在HTML中编码href属性


应该对href属性的内容做什么:HTML或URL编码?

<a href="???">link text</a>

一方面,由于href属性包含URL我应该使用URL编码。 另一方面,我将此URL插入HTML,因此必须进行HTML编码。

请帮我克服这个矛盾。

谢谢。


编辑:

这是矛盾。假设URL中可能包含“<”和“>”字符。 URL编码不会转义它们,因此href属性中会有保留的HTML字符,这违反了标准。 HTML编码将转义'<'和'>'字符,HTML将有效,但在此之后,URL中将出现意外的'&'字符(这是URL的保留字符,它用作查询字符串参数的分隔符) 。

保留的URL字符 形成了一个超集 保留的HTML字符 除了为HTML保留但不为URL保留的'<'和'>'。


编辑2:

我对'<'和'>'字符错了,它们实际上是通过URL编码转义的百分比。如果是这样,在这种情况下URL编码就足够了,不是吗?


12031
2018-04-17 10:28


起源

你到目前为止有没有尝试过什么 - Michael Sazonov
这个“你有没有尝试过任何东西”模因变得愚蠢。对于浏览器错误恢复,大部分数据编码都是为了防止出现安全问题。如果你正在尝试某些事情,你应该怎么告诉你做对了?假设您拥有的安全测试套件有足够的覆盖范围吗?这是关于基本技术的完全合理的问题。 - Quentin
昆汀或多或少是正确的,但问题仍然存在,哪些情况可能是矛盾的?你能举个例子吗?你是否尝试过这两种解决方案并且它们都工作了,或者两者都不起作用? - Mr Lister
是的,我尝试了两种方式并更新了问题。在我看来,HTML编码在这种情况下根本不合适。现在我想弄明白是不是真的如此。 - Maksim Tyutmanov
重新编辑:我不确定你的意思是“HTML编码将逃脱'<'和'>'字符,HTML将有效,但之后网址中会出现意外的'&'字符”怎么样? &lt; 简直就是写作的方式 < 在您的HTML源代码中,它被翻译回来 < 在它被发送到服务器之前很久就处于非常低的水平。与...相同 &:你应该写 &amp; 系统会知道你的意思 &。或者你的意思是其他什么? - Mr Lister


答案:


正常构造URL。遵循构建URL的规则。对您输入的数据进行编码。

然后正常构造HTML。遵循构建HTML的规则。在将数据放入其中时对数据进行编码。

即两者(但顺序正确)。

它们不是相互排斥的,所以没有矛盾。

例如(这是一个简化的例子,假设$ _GET中的数据是正确且存在的,不要在现实世界中这样做):

$search_term = $_GET['q'];
$page = $_GET['page'];
$next_page = $page + 1;
$next_page_url = 'http://example.com/search?q=' . urlencode($search_term) . '&page=' . urlencode($page);
$html = '<a href="' . htmlspecialchars($next_page_url) . '">link text</a>';

11
2018-04-17 10:30



谢谢,昆汀,我明白了。但我不太确定两件事。 1)如果htmlspecialchars()实际编码了什么会发生什么?如果是这样,URL中会有“&”字符,这是不允许的。 2)URL编码是否可以在自身之后留下一些保留的HTML字符?我认为不是。 - Maksim Tyutmanov
不会有 &amp; 在URL内。那里将会是 &amp; 在HTML内部。将解析HTML和字符 & 会出现在DOM中。如果您将属性的HTML源复制/粘贴到浏览器中,那么它会中断,但您不应该这样做。如果您将URL存储在文本文件中,将其解压缩,然后将压缩文件的二进制内容复制/粘贴到地址栏,它也会中断。 - Quentin
我不记得在我脑海中的URL中编码/未编码的字符列表。当然,URL可以包含字符(例如 &)它在HTML中具有特殊含义(如果您希望它们在URL中具有特殊含义,则不应对其进行urlencoded,如我给出的示例所示)。 - Quentin