OK查询字符串之前要跳过的斜线?(OK to skip slash before query str

2019-08-31 22:40发布

它是安全的追加查询字符串时总是跳过结尾的斜线?

也就是说,我可以使用

http://example.com?querystring

代替:

http://example.com/?querystring

? 所有主机管理我用支持这一但它是安全的假设,所有的服务器环境将支持此方法? 它是标准?

Answer 1:

不,它是不正确的跳过斜线。可能工作的现代浏览器:不过,这并不能使它正确。

参见RFC1738 - URL和RFC2396 - URI 。

每RFC1738(我已经排除这里的模式格式)格式:

// <用户>:<密码> @ <主机>:<端口> / <URL路径>

它接着指出:

......在“/”主机之间(或端口)和URL路径是不是URL路径的一部分。

在这种情况下,“?” 是url-路径的一部分,其

...取决于所使用的方案一样,在其中它被解释的方式。

还要注意的是,每规范,它是完全有效的省略 “/ URL路径” -注意,“/”已经明确在这种情况下包括在内。

因此,“foo.com?bar”是无效的,因为没有“/”前的URL路径。



Answer 2:

作为现代规范的问题, 是的 ,它是允许跳过斜线 ,相反的是该接受的答案在这里索赔。

虽然接受的答案正确地引用了RFC 1738(20年前!发布),它错误地声称,RFC 2396(1998年发布)要求斜杠,而忽略这两个这些规格都依次被废弃RFC 3986中发布2005年被(公认的答案之前,还需要几年的写),最近WHATWG URL标准 ,这两者都允许将被省略的斜线。

让我们看看这些规范反过来,从最早到最晚的:


RFC 1738:统一资源定位器(URL) (1994年发布)

隐需要由包括斜杠规定, 如果 URL中含有既不的路径也不是查询字符串可以省略 (称为searchpart ,在这里)。 下面加粗是我的:

一个HTTP URL的形式:

 http://<host>:<port>/<path>?<searchpart> 

其中<host><port>是如在描述第3.1节 。 如果: <port>被省略,则端口默认为80没有用户名或密码是允许的。 <path>是一个HTTP选择器,和<searchpart>是一个查询字符串。 所述<path>是可选的,因为是<searchpart>和它的前面的“?”。 如果既没有<path>也不<searchpart>存在,则“/”也可以省略。


RFC 2396:统一资源标识符(URI):通用语法 (1998年发布, “更新” RFC 1738)

这是可以接受的省略斜线。 本RFC合法化没有计划后双斜线一些奇怪的URL语法,但如果我们忽视这些(他们用的那些opaque_part在规范中的BNF ),并坚持到包含一个主机的网址,然后我们发现一个absoluteURI是这样定义...

absoluteURI   = scheme ":" ( hier_part | opaque_part ) 

和一个hier_part如下:

hier_part     = ( net_path | abs_path ) [ "?" query ] 

和一个net_path如下:

net_path      = "//" authority [ abs_path ] 

其中一个abs_path被依次定义开始以斜线。 需要注意的是abs_path是在上面的语法可选的 -这意味着该格式的URL scheme://authority?query是完全合法的。

这种变化的动机在附录暗示G.2。 来自RFC 1738和RFC 1808的修改 :

问号“?” 字符被从该组中的授权组成用户信息允许的字符移除,因为测试表明,许多应用程序把它当作保留用于从URI的其余部分分离所述查询组件。

换句话说 - 在现实世界中的代码被假定第一个问号的URL,任何地点,标志着一个查询字符串的开头,所以规范是务实更新,与现实保持一致。


RFC 3986:统一资源标识符(URI):通用语法 (2005年发布; “淘汰了” RFC 2396)

再次,这是允许忽略斜线。 该规范由话说,“路径”是必需的,它包含一个机构(主机)每一个URI,而且路径必须以斜杠包括没有字符表示这样的:

3.语法成分

通用URI语法由称为方案,授权,路径,查询和片段组件的分层序列构成。

 URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] hier-part = "//" authority path-abempty / path-absolute / path-rootless / path-empty 

该方案和路径组件是必需的,尽管该路径可以是空的(没有字符)。 当权限存在时,路径必须是空的或用斜线(“/”)字符开始。

为了完整起见,注意path-abempty以后这样定义:

path-abempty  = *( "/" segment ) 

这确实允许它不包含任何字符。


URL标准由WHATWG(下积极维护生活水平,在2012年第一次创建,与obsoleting RFC 3986的目标)

同样,省略了斜线是可以接受的,但这个时候,我们有没有BNF看,而是需要阅读大量的散文。

第4.3节告诉我们:

一个绝对URL字符串必须是下列之一

  • 一个URL的方案字符串是一个ASCII不区分大小写的匹配项特别计划 ,而不是一个ASCII不区分大小写的匹配“ file ”,其次是“ : ”和一个方案,相对特殊的URL字符串
  • 一个URL的方案字符串 不是一个ASCII不区分大小写的匹配项特别计划 ,其次是“:”和一个相对URL字符串
  • 一个URL的方案字符串是一个ASCII不区分大小写的“文件”的比赛,其次是“:”和方案相对文件的URL字符串

任何可选其次是“?” 和URL,查询字符串。

由于HTTP和HTTPS是特殊方案 ,任何HTTP或HTTPS URL必须满足第一的那些三个选项-即, http:https:后跟一个方案后相对特殊URL字符串 ,其中:

必须是“ // ”,后跟一个有效的主机串 ,后面可以跟“ : ”和一个URL端口串 ,后面可以跟一个路径绝对URL字符串 。

甲路径绝对URL字符串被定义为开始以斜线,但在上述的绝对URL字符串的定义明确可选的; 因此,允许从主机直接去了“ ? ”和查询字符串,像这样的URL http://example.com?query是合法的。


当然,这一切都不提供铸铁保证每个Web服务器或HTTP库将接受这样的网址,也不是说他们会把这作为一个语义上等同于包含斜杠的URL。 但据规格去,跳过斜线是完全合法的。



Answer 3:

它是不是安全的假设。 Web服务器和自包含的Web应用程序通常检查在请求中提供的网址,但不能保证他们会将/abc等于/abc/ 。 Web服务器和自包含的Web应用程序可以做任何他们从URL收集的信息 ,它并不一定是你所期望的。 你将不得不找出约定是什么有问题的特定URL。

注意,当然,大多数Web服务器和Web应用程序框架,努力尝试,接受各种输入,并与他们妥善处理。 因此,在大多数情况下,Web服务器或独立的Web应用程序将把/abc等于/abc/ 。 但请记住,因为服务器可以为所欲为它与路径喜欢,这是简单地与潜在的许多例外的一般观察。



Answer 4:

添加到一些我研究这个问题后,发现了更多的信息接受的答案:

http://tools.ietf.org/html/rfc2396

的权限的部件由双斜线“//”,并且由下一个斜线“/”,问号终止“?”,或由URI的末尾。 在授权部分,字符“;”,“?”,“”,“@”,和“/”被保留

在此基础上声明,问号应注明授权组成部分的结尾,有或没有斜线。

http://tools.ietf.org/html/rfc1738 (变量替换)

的{路径}是可选的,因为是{searchpart}和其前面的“?”。 如果既没有{路径}也不{searchpart}存在,则“/”也可以省略。

不过,这一说法说,如果两个路径和searchpart没有预设的斜线只能被省略。

在现实世界,我以前能够查询值之前省略斜线,但最近发现的情况是落下来。 如果您有疑问,如本http://my.domain.com?do=something ,并查看Internet Explorer中的HTML页面,链接是通过IE 修复 。 如果再通过电子邮件单击文件,发送,网页...,链接被添加到电子邮件的格式无效。 这些问题通过查询值的内容有所不同,但我们能够创造无效的网址。

总之,它应该工作,但在边缘的情况下倒下。



文章来源: OK to skip slash before query string?