是一个冒号安全的友好URL的使用?

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

http://site/gwturl#section1/section2 

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

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

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

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

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

我最近写了一个URL编码器,所以这在我脑海中是非常新鲜的。

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

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

ABNF的相关部分:

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

除了这些限制之外,碎片部分没有超出应用程序给出的限定结构。 该scheme,http只说,你不发送这部分到服务器。


编辑:

D'哦!

尽pipe我对URI规范有所断言,但当他指出 HTML 4规范限制元素名称/标识符时, 不可否认的是提供了正确的答案。

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

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

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

所以你很幸运 “:”是明确允许的。 没有人应该“%” – 逃避它,不仅因为“%”是非法的字符,而且因为片段很多符合锚点名字,因此没有代理人应该尝试与他们锤炼。

但是你必须testing它。 networking标准没有严格遵循,有时标准是相互冲突的。 例如HTTP / 1.1 RFC 2616不允许请求URL中的查询string,而HTML在使用GET方法提交表单时构造一个。 无论在现实世界中执行哪一个,都会在一天结束时获胜。

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

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

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

来自URLEncoder javadoc:

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

编码string时,应用下列规则:

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

那就是:不安全。

我没有看到Firefox或IE8编码包含字符的一些维基百科URL 。

如果协议要求authentication,则冒号被用作用户名和密码之间的分隔符。

冒号不安全。 看这里

它不是一个安全的字符,用来区分你连接到什么端口,当你的域名后