冒号`:`可安全用于友好URL吗?


109

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

http://site/gwturl#section1/section2

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

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

当然,我们这样做是为了实现url友好性,因此我们希望确保这些具有特殊含义的字符都不会被浏览器或任何其他系统进行url编码,并以类似url的结尾这个:

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

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


最好指定(更清楚地)仅在客户端使用URL?由于很多答案(就像我的一样)似乎都假设您将使用HTTP将URL发送到服务器。
Veger 2010年

进行编辑以增加说明该片段的使用正在客户端发生。
妮可(Nicole)2010年

我很好奇:10个月后,这个url方案对您有用吗?我正在考虑使用相同的方案。
乔纳森·斯威尼

1
@Jonathan Swinney,很遗憾,我已经离开了这个项目(和公司),尽管这里的答案令我满意,这是前进的道路。如果我要开始一个新项目,我将使用此方案,但是我也将确保使用该方案#!来指示页面是有状态的-请参阅googlewebmastercentral.blogspot.com/2009/10/…(此建议已被坚持由AJAX的重度用户(例如Facebook)创建)
妮可(Nicole

我刚刚发现WhatsApp会在第一个冒号上剪切一个URL,因此例如它使Google Maps URL无用。所以是的,逃脱它很重要。
Petruza '16

Answers:


83

我最近了一个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    = "!" / "$" / "&" / "'" / "(" / ")"
                 / "*" / "+" / "," / ";" / "="

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


编辑:

天哪!

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

请注意,标识符规则在HTML 5中正在更改。URI限制仍然适用(在撰写本文时,有关HTML 5使用URI的问题尚未解决)。


我认为您正在做某事,可以进一步解释一下吗?不发送此消息到服务器不是问题,因为我们正在使用GWT。我只是不确定我对您引用的部分所指定的语法是否清楚。
妮可(Nicole)2010年

但是:是gen-delim,而不是sub-delim。
bobince 2010年

1
分号对于pchar是合法的,因此无论是sub-delim还是gen-delim都不是问题
Veger,2010年

@bobince- :在中pchar,在中fragment,所以:允许。@Renesis-Wikipedia在ABNF上有一篇文章en.wikipedia.org/wiki/ABNF您基本上是在查看允许字符的列表,其中/表示OR。我还没有完成任何GWT编程,所以我不知道它如何使用URI的片段部分。
McDowell 2010年

最后一个问题-您是否对该规范的实际应用有任何了解?这是否意味着浏览器应该/将忽略:片段中的(跳过编码)?
妮可,2010年

59

除了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方法提交表单时会构造一个查询字符串。最终,无论是在现实世界中实施的哪种产品都将获胜。



7

我不会指望它。可能会像%3A许多用户代理一样对url进行编码。


1
@arbales:是的。某些不合规的用户代理将使不合规的URL不再被修饰。
Asaph

4

URLEncoderjavadoc:

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

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

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

即是:不安全的。


3

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


1
Opera还保留分号,但指望这种行为不是一件好事
Veger 2010年

1
Renesis谈论的是URL片段,而不是URL路径。
Gumbo 2010年

在写这个问题时,维基百科是我的想法之一。那么,使用冒号在技术上是否无效/不安全?我通常在Wikipedia URL中看到(和)已编码的URL,但从未看到冒号,这使我有些困惑。
妮可

3
Wayback Machine在其许多链接中都有一个-例如,web.archive.org
web / 20080822150704 / http://stackoverflow.com

2

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


0

冒号不安全。看这里


该页面没有动机说明为什么它们不安全。引用的RFC2396也没有说应该对其进行转义。另外,提供的转换器脚本不会对其进行编码(无论如何在Chrome 9中)。
亚当·林德伯格

亚当,你错了。它直接说明了什么以及为什么。
ktamlyn

-5

它不是安全字符,用于区分域名后紧跟的端口

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.