6

是否允许 HTTP 请求 URI 包含“..”段?

根据 RFC 2616 第 5.1.2 节,它们可以引用绝对 URI 或绝对路径(该部分中的其他选项与此问题无关)。

绝对 URI 和绝对路径的含义在 RFC 3986 中进行了描述,它还描述了一种规范化路径的算法(包括删除单点和双点元素)。

但是,我找不到符合 RFC 的请求 URI 是否可以包含“..”段的确切规范 - 它们是否允许在绝对路径/URI 中,并且服务器是否必须规范化此类 URI?还是这取决于客户?

“位置:”响应标头有什么区别吗?根据规范,它们只能包含绝对 URI,但这是否包括“..”部分?在请求引用的资源之前,客户端是否也必须对它们进行规范化?

澄清一下,我知道../foo在这些情况下类似的 URI 是非法的,但是呢http://example.com/../foo?这是一个有效的绝对 URI 吗?

我目前正在将客户端重定向到此类 URI,并想知道这是否符合规范。

4

3 回答 3

5

如果你想“知道它是否符合规范”,为什么不简单地参考相关规范呢?

RFC 3986 第 5.2 节非常清楚应该如何解析 URI 点段:

本节描述了一种算法,用于将可能与给定基本 URI 相关的 URI 引用转换为引用目标的已解析组件。然后可以重组组件,如第 5.3 节所述,以形成目标 URI。该算法提供了确定的结果,可用于测试其他实现的输出。应用程序可以通过使用其他算法来实现相对参考分辨率,前提是结果与该算法给出的结果相匹配。

例如,如果您关注Location:标头,则规范化和解析无效的相对路径通常是谨慎的(Location:标头应该是绝对 URI)。在这些情况下,您绝对应该遵循 RFC 3986 的说明来根据您的基本 URI 解析这些路径。

你应该在你的 URI 中到处传递点段吗?如果您可以提供帮助,可能不会,因为您依赖其他人正确实施规范。但是传递带有点段的 URI 是否违反了 URI 规范?没有

于 2012-11-08T01:08:27.823 回答
2

从语法上讲,http://example.com/../foo是一个有效的 URI。

服务器如何解释该 URI 是另一回事。出于明显的安全原因,服务器必须非常小心如何将 URI 转换为文件路径。通常,服务器要么删除..段,要么进行某种后处理以确保文件路径位于文档根目录内。

于 2012-11-07T20:18:48.010 回答
0

(感谢您在一个充满绝望的公众困惑的话题中提出了一个伟大而清晰的问题,由神秘的规格和令人惊讶的微妙之处助长!)

... http://example.com/../foo呢?这是一个有效的绝对 URI 吗?

  1. 不,这是一个无效的绝对 URI,因为它试图引用命名机构命名空间(根)之外的地方。

(因此,当我尝试向服务器提供类似的东西时,我得到了服务器应有的“400 Bad request”响应。)

  1. 但是,假设您真的要询问有效但同样非规范化的绝对​​路径,例如/root/../foo:@rdlowrey 的答案是正确的:如果可以的话,最好自己规范化它们。

(再次,作为一个例子,当浏览器发送到同一服务器时,我的代理在运行良好的页面上失败了,这会更加努力地规范化点部分,而不是依赖服务器做同样的事情。)

但是,我找不到符合 RFC 的请求 URI 是否可以包含“..”段的确切规范 - 它们是否允许在绝对路径/URI 中,并且服务器是否必须规范化此类 URI?还是这取决于客户?

  1. 不幸的是,您没有找到它,因为它没有指定,即使在HTTP 2中,AFAICT :-/
于 2018-03-31T17:30:34.677 回答