如何在 HTML 中编码 href 属性

Posted

技术标签:

【中文标题】如何在 HTML 中编码 href 属性【英文标题】:how to encode href attribute in HTML 【发布时间】:2012-04-28 16:33:22 【问题描述】:

href 属性的内容应该怎么做:html 还是 URL 编码?

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

一方面,由于 href 属性包含 URL,我应该使用 URL 编码。 另一方面,我将这个 URL 插入到 HTML 中,所以它必须是 HTML 编码的。

请帮助我克服这个矛盾。

谢谢。


编辑:

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

Reserved URL characters 构成了reserved HTML characters 的超集,除了为 HTML 保留但不为 URL 保留的“”。


编辑 2:

我对“”字符的理解是错误的,它们实际上是通过 URL 编码进行了百分比转义。如果是这样,在这种情况下,URL 编码就足够了,不是吗?

【问题讨论】:

到目前为止你有没有尝试过? 这个“你试过什么了吗”的表情包越来越傻了。对于浏览器错误恢复,很大一部分数据编码是为了防止安全问题。如果你正在尝试某事,你应该如何告诉你做对了?假设您拥有的任何安全测试套件都有足够的覆盖范围?这是一个关于基本技术的完全合理的问题。 Quentin 或多或少是对的,但问题仍然存在,什么情况下可能是矛盾的?你能举个例子吗?您是否尝试了这两种解决方案,它们都有效,还是都无效? 是的,我已经尝试了两种方法并更新了问题。在我看来,HTML 编码在这种情况下根本不合适。现在我想弄清楚是不是真的如此。 重新编辑:我不确定您的意思是“HTML 编码将转义 '' 字符并且 HTML 将是有效的,但之后会有意外的 '&' URL 中的字符”怎么回事? &amp;lt; 只是在您的 HTML 源代码中编写 &lt; 的方法,它在非常低的级别被转换回 &lt;,早在它被发送到服务器之前。与&amp;amp; 相同:你应该写&amp;amp;,系统会知道你的意思是&amp;amp;。还是你的意思是别的? 【参考方案1】:

像往常一样构造一个 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($next_page);
$html = '<a href="' . htmlspecialchars($next_page_url) . '">link text</a>';

【讨论】:

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

以上是关于如何在 HTML 中编码 href 属性的主要内容,如果未能解决你的问题,请参考以下文章

HTML5中如何显示视频HTML5视频播放

如何修复 AttributeError:“列表”对象没有属性“编码”

iOS进阶 - 如何制定一套适合自己团队的 iOS 编码规范?

如何在编码阶段减少代码中的bug?

Python 中如何设置 stdout 的编码?

如何更改python数组的编码?