如何在 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 中的字符”怎么回事?&lt;
只是在您的 HTML 源代码中编写 <
的方法,它在非常低的级别被转换回 <
,早在它被发送到服务器之前。与&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;
。 HTML 中会有&amp;
。 HTML 将被解析,字符 &
将出现在 DOM 中。如果您将属性的 HTML 源复制/粘贴到浏览器中,那么它会中断,但您不应该这样做。如果您将 URL 存储在文本文件中,将其压缩,然后将压缩文件的二进制内容复制/粘贴到地址栏,它也会中断。
我不记得在我脑海中的 URL 中编码/未编码的字符列表。当然,URL 可以包含在 HTML 中具有特殊含义的字符(例如 &
)(如果您希望它们在 URL 中具有特殊含义,则不应对其进行 urlencoded,根据我给出的示例)。跨度>
以上是关于如何在 HTML 中编码 href 属性的主要内容,如果未能解决你的问题,请参考以下文章
如何修复 AttributeError:“列表”对象没有属性“编码”