冒号`:`是否可以安全地使用URL?

时间:2010-01-12 23:04:01

标签: url gwt special-characters friendly-url

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

http://site/gwturl#section1/section2

某些部分可能需要其他属性,我们希望使用:指定这些属性,以便URL的部分部分明确无误。代码首先在/上分割,然后在:上分割,如下所示:

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

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

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

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

10 个答案:

答案 0 :(得分:72)

我最近wrote一个网址编码器,所以这在我看来很新鲜。

  

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

fragment partuser:45/comments)中的所有字符对于RFC 3986 URI都是完全合法的。

ABNF的相关部分:

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

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


编辑:

D'哦!

尽管我对URI规范有断言,irreputablehe points out HTML 4规范限制元素名称/标识符时提供了正确的答案。

请注意,标识符规则为changing in HTML 5。 URI限制仍然适用(在撰写本文时,HTML 5使用URI时存在一些未解决的问题。)

答案 1 :(得分:56)

除了McDowell对URI标准的分析之外,还要记住该片段必须是有效的HTML锚名称。根据{{​​3}}

  

ID和NAME令牌必须以a开头   信([A-Za-z]),可以遵循   任意数量的字母,数字   ([0-9]),连字符(“ - ”),下划线   (“_”),冒号(“:”)和句号   ( “”)。

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

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

答案 2 :(得分:50)

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

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

答案 3 :(得分:7)

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

答案 4 :(得分:4)

来自URLEncoder javadoc:

  

有关HTML表单的更多信息   编码,请参考HTML   specification

     

编码String时,如下所示   规则适用:

     
      
  • 字母数字字符“a”   通过“z”,“A”到“Z”和“0”   通过“9”保持不变。
  •   
  • 的   特殊字符“。”,“ - ”,“*”和   “_“ 保持不变。
  •   
  • 空间   字符“”转换为加号   签署“+”。
  •   
  • 所有其他角色都是   不安全,首先转换成   使用某种编码的一个或多个字节   方案。然后表示每个字节   由3个字符的字符串“%xy”,其中   xy是两位十六进制数   字节的表示。该   建议使用的编码方案是   UTF-8。但是,为了兼容性   原因,如果编码不是   指定,然后是默认编码   使用平台。
  •   

也就是说,:并不安全。

答案 5 :(得分:3)

我没有看到Firefox或IE8编码包含该角色的一些维基百科URLs

答案 6 :(得分:3)

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

答案 7 :(得分:1)

Google 也使用冒号。

this specification 中,它们使用冒号作为自定义方法名称。

答案 8 :(得分:0)

冒号不安全。 See here

答案 9 :(得分:-5)

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