它是安全的追加查询字符串时总是跳过结尾的斜线?
也就是说,我可以使用
http://example.com?querystring
代替:
http://example.com/?querystring
? 所有主机管理我用支持这一但它是安全的假设,所有的服务器环境将支持此方法? 它是标准?
它是安全的追加查询字符串时总是跳过结尾的斜线?
也就是说,我可以使用
http://example.com?querystring
代替:
http://example.com/?querystring
? 所有主机管理我用支持这一但它是安全的假设,所有的服务器环境将支持此方法? 它是标准?
不,它是不正确的跳过斜线。 它可能工作的现代浏览器:不过,这并不能使它正确。
参见RFC1738 - URL和RFC2396 - URI 。
每RFC1738(我已经排除这里的模式格式)格式:
// <用户>:<密码> @ <主机>:<端口> / <URL路径>
它接着指出:
......在“/”主机之间(或端口)和URL路径是不是URL路径的一部分。
在这种情况下,“?” 是url-路径的一部分,其
...取决于所使用的方案一样,在其中它被解释的方式。
还要注意的是,每规范,它是完全有效的省略 “/ URL路径” -注意,“/”已经明确在这种情况下包括在内。
因此,“foo.com?bar”是无效的,因为没有“/”前的URL路径。
作为现代规范的问题, 是的 ,它是允许跳过斜线 ,相反的是该接受的答案在这里索赔。
虽然接受的答案正确地引用了RFC 1738(20年前!发布),它错误地声称,RFC 2396(1998年发布)要求斜杠,而忽略这两个这些规格都依次被废弃RFC 3986中发布2005年被(公认的答案之前,还需要几年的写),最近WHATWG URL标准 ,这两者都允许将被省略的斜线。
让我们看看这些规范反过来,从最早到最晚的:
隐需要由包括斜杠规定, 如果 URL中含有既不的路径也不是查询字符串可以省略 (称为searchpart
,在这里)。 下面加粗是我的:
一个HTTP URL的形式:
http://<host>:<port>/<path>?<searchpart>
其中
<host>
和<port>
是如在描述第3.1节 。 如果:<port>
被省略,则端口默认为80没有用户名或密码是允许的。<path>
是一个HTTP选择器,和<searchpart>
是一个查询字符串。 所述<path>
是可选的,因为是<searchpart>
和它的前面的“?”。 如果既没有<path>
也不<searchpart>
存在,则“/”也可以省略。
这是可以接受的省略斜线。 本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,任何地点,标志着一个查询字符串的开头,所以规范是务实更新,与现实保持一致。
再次,这是允许忽略斜线。 该规范由话说,“路径”是必需的,它包含一个机构(主机)每一个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 )
这确实允许它不包含任何字符。
同样,省略了斜线是可以接受的,但这个时候,我们有没有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。 但据规格去,跳过斜线是完全合法的。
它是不是安全的假设。 Web服务器和自包含的Web应用程序通常检查在请求中提供的网址,但不能保证他们会将/abc
等于/abc/
。 Web服务器和自包含的Web应用程序可以做任何他们从URL收集的信息等 ,它并不一定是你所期望的。 你将不得不找出约定是什么有问题的特定URL。
注意,当然,大多数Web服务器和Web应用程序框架,努力尝试,接受各种输入,并与他们妥善处理。 因此,在大多数情况下,Web服务器或独立的Web应用程序将把/abc
等于/abc/
。 但请记住,因为服务器可以为所欲为它与路径喜欢,这是简单地与潜在的许多例外的一般观察。
添加到一些我研究这个问题后,发现了更多的信息接受的答案:
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 修复 。 如果再通过电子邮件单击文件,发送,网页...,链接被添加到电子邮件的格式无效。 这些问题通过查询值的内容有所不同,但我们能够创造无效的网址。
总之,它应该工作,但在边缘的情况下倒下。