Is a colon `:` safe for friendly-URL use?

Nic*_*ole 104 url gwt friendly-url special-characters

We are designing a URL system that will specify application sections as words separated by slashes. Specifically, this is in GWT, so the relevant parts of the URL will be in the hash (which will be interpreted by a controller layer on the client-side):

http://site/gwturl#section1/section2
Run Code Online (Sandbox Code Playgroud)

Some sections may need additional attributes, which we'd like to specify with a :, so that the section parts of the URL are unambiguous. The code would split first on /, then on :, like this:

http://site/gwturl#user:45/comments
Run Code Online (Sandbox Code Playgroud)

Of course, we are doing this for url-friendliness, so we'd like to make sure that none of these characters which will hold special meaning will be url-encoded by browsers, or any other system, and end up with a url like this:

http://site/gwturl#user%3A45/comments <--- BAD
Run Code Online (Sandbox Code Playgroud)

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

McD*_*ell 78

我最近了一个URL编码器,所以这在我看来是非常新鲜的.

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

片段part(user:45/comments)中的所有字符对于RFC 3986 URI 都是完全合法的.

ABNF的相关部分:

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

除了这些限制之外,片段部分没有超出应用程序提供的结构的定义结构.该方案http仅表示您不将此部分发送到服务器.


编辑:

D'哦!

尽管我对URI规范断言,irreputable提供正确的答案时,他指出,将HTML 4的规格限制的元素名称/标识符.

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


irr*_*ble 59

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

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

所以你很幸运.明确允许使用":".没有人应该"%" - 逃避它,不仅因为"%"在那里是非法的char,而且因为片段很多地匹配锚名称char-by-char,因此无论如何没有代理人应该尝试与他们一起调节.

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


小智 56

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

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

  • 最相关的答案.我们都知道规范中的内容与Web开发中的现实关系不大.你不会比"世界十大网站之一"更好地保证"安全". (28认同)
  • @StevenCollins 没有比在这个陈述完全相同的事情之前 3 年给出的答案更相关:) (2认同)

Asa*_*aph 7

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

  • *许多*用户代理? (5认同)

axt*_*avt 5

来自URLEncoderjavadoc:

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

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

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

也就是说,:不安全。


Sab*_*fir 5

谷歌也使用冒号。

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