我发布了一个新答案,因为我发现zneak的答案没有足够的示例,没有将HTML和URI处理显示为不同的方面和标准,并且缺少一些小东西。
您有两个关于链接(<a href
)中URL的标准。
第一个标准是RFC 1866(HTML 2.0),其中在“ 3.2.1。数据字符”中,您可以读取用作HTML属性值时需要转义的字符。(属性本身根本不允许使用特殊字符,例如<a hr&ef="http://...
,不允许,也不允许<a hr&ef="http://...
。)
后来这已进入HTML 4标准,您需要转义的字符为:
< to <
> to >
& to &
" to "e;
' to '
另一个标准是RFC 3986 “通用URI标准”,在该标准中处理URL(这种情况发生在浏览器要跟随链接,因为用户单击HTML元素时)。
reserved = gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
对这些字符进行转义很重要,以便客户端知道它们是否代表数据或定界符。
未转义的示例:
https://example.com/?user=test&password&te&st&goto=https://google.com
示例,完整合法的URL
https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com
HTML属性值中的示例完全合法的URL:
https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com
同样重要的场景:
JavaScript作为值:
<img src="..." onclick="window.location.href = "https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com";">...</a>
(是的,;;
是正确的。)
JSON作为值:
<a href="..." data-analytics="{"event": "click"}">...</a>
转义内容中的转义内容,双重编码,参数内URL中的URL等,...
http://x.com/?passwordUrl=http%3A%2F%2Fy.com%2F%3Fuser%3Dtest&password=""123