存货文,积了好久,懒得发233,今天发下。
关于 path variables ; 的解析及经典..;/
的成因
RFC文档中关于 path expansion 的描述中,有下面的模板例子
1 | Type Separator |
而 /path;key=value
是一种Path variables的形式,类似最常见的?key=value
。Tomcat对其的解析在CoyoteAdapter#parsePathParameters()
关键代码
1 | protected void parsePathParameters(org.apache.coyote.Request req, |
其中尤为关注带[+]
注释的代码,这些代码是..;/
会被tomcat认为是../
的关键。
首先判断path variables的右边界是/
,这样我们可以构造形如/path;key=value/;key=value
的形式
下面将;key=value
抹除,将后面的字符串拼接上去。类似下面这样
1 | URI |
结合上面两种特性,可以发现URI中有”被替换”和”拼接”的操作。这两种操作组合起来容易衍生出”绕过“、”预期不符“、”解析不一致“的问题。所以当我们传入了这样的URI
1 | /path/..;/ |
由于;
和/
之间没东西,又会被抹去;
。最终URI会变成
1 | /path/../ |
PS:看代码的时候,思路一定不能被他原本的功能限制住了,梳理好功能后一定要跳出来看,结合功能的场景(比如这里path variables是在URI上的)发散思考。