121

我们正在设计一个 URL 系统,它将应用程序部分指定为由斜线分隔的单词。具体来说,这是在 GWT 中,因此 URL 的相关部分将在哈希中(将由客户端的控制器层解释):

http://site/gwturl#section1/section2

有些部分可能需要额外的属性,我们想用 a 来指定:,以便 URL 的部分部分是明确的。代码将首先在 上拆分/,然后在 上拆分:,如下所示:

http://site/gwturl#user:45/comments

当然,我们这样做是为了 url 友好,所以我们想确保这些具有特殊含义的字符都不会被浏览器或任何其他系统进行 url 编码,并最终得到类似的 url这:

http://site/gwturl#user%3A45/comments <--- BAD

以这种方式使用冒号对于浏览器、书签系统甚至 Javascript 或 Java 代码是否安全(我的意思是不会自动编码)?

4

10 回答 10

90

我最近了一个 URL 编码器,所以这对我来说很新鲜。

http://site/gwturl#user:45/comments

片段部分( ) 中的所有字符对于RFC 3986 URIuser:45/comments来说都是完全合法的。

ABNF的相关部分:

fragment      = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
                 / "*" / "+" / "," / ";" / "="

除了这些限制之外,除了您的应用程序提供的结构之外,片段部分没有定义的结构。这个方案,http,只是说你不把这部分发送到服务器。


编辑:

哦!

尽管我对 URI 规范有断言,但当他指出 HTML 4 规范限制元素名称/标识符时,irregable提供正确的答案。

请注意,标识符规则在 HTML 5 中发生了变化。URI 限制仍然适用(在撰写本文时,围绕 HTML 5 对 URI 的使用存在一些未解决的问题)。

于 2010-01-13T00:06:13.043 回答
76

MediaWiki 和其他 wiki 引擎在其 URL 中使用冒号来指定名称空间,显然没有什么大问题。

例如http://en.wikipedia.org/wiki/Template:Welcome

于 2013-01-11T00:45:24.383 回答
64

除了 McDowell 对 URI 标准的分析,还要记住片段必须是有效的 HTML 锚名称。根据http://www.w3.org/TR/html4/types.html#type-name

ID 和 NAME 标记必须以字母 ([A-Za-z]) 开头,后跟任意数量的字母、数字 ([0-9])、连字符 ("-")、下划线 ("_") , 冒号 (":") 和句点 (".")。

所以你很幸运。“:”是明确允许的。并且没有人应该“%”-逃避它,不仅因为“%”在那里是非法字符,而且因为片段必须逐个字符匹配锚名称,因此任何代理都不应该尝试以任何方式篡改它们。

但是,您必须对其进行测试。没有严格遵循 Web 标准,有时标准是相互冲突的。例如 HTTP/1.1 RFC 2616 不允许在请求 URL 中使用查询字符串,而 HTML 在使用 GET 方法提交表单时构造一个。在现实世界中实施的任何一方最终都会获胜。

于 2010-01-13T00:52:59.377 回答
9

我不会指望它。它可能会%3A被许多用户代理编码为 url。

于 2010-01-12T23:06:30.153 回答
4

来自URLEncoderjavadoc:

有关 HTML 表单编码的更多信息,请参阅 HTML 规范

对字符串进行编码时,适用以下规则:

  • 字母数字字符“a”到“z”、“A”到“Z”和“0”到“9”保持不变。
  • 特殊字符“.”、“-”、“*”和“_”保持不变。
  • 空格字符“”转换为加号“+”。
  • 所有其他字符都是不安全的,并且首先使用某种编码方案将其转换为一个或多个字节。然后每个字节由 3 个字符的字符串“%xy”表示,其中 xy 是字节的两位十六进制表示。推荐使用的编码方案是 UTF-8。但是,出于兼容性原因,如果未指定编码,则使用平台的默认编码。

也就是说,:不安全。

于 2010-01-12T23:08:23.487 回答
4

我没有看到 Firefox 或 IE8 对包含该字符的某些 Wikipedia URL进行编码。

于 2010-01-12T23:10:20.313 回答
3

谷歌也使用冒号。

本规范中,他们使用冒号作为自定义方法名称。

于 2021-02-12T18:15:50.230 回答
2

如果协议需要身份验证,冒号用作用户名和密码之间的分隔符。

于 2010-01-13T00:46:39.637 回答
0

结肠不安全。看这里

于 2010-01-12T23:09:31.360 回答
-5

它不是一个安全字符,当它紧跟在您的域名后面时,用于区分您连接的端口

于 2010-01-13T00:05:24.510 回答