最近在某个创业公司使用 rrestjs 框架中碰到一个问题,更新到0.9.x版本的rreestjs框架后,在windows下无法正常分割用户的请求,导致他们公司的项目无法正常开发了。收到这个消息,我也很纳闷,因为之前在0.8.x时并没有出现这个问题,而且我还特别写了单元测试代码,当然那些代码主要是在linux下跑测试的。
对比0.9和0.8版本之间的主要req.path那块代码的区别是,我把用户的请求路径通过了这个函数:path.normalize(p),官方给这个函数的示例是:1
2
3path.normalize('/foo/bar//baz/asdf/quux/..')
// returns
'/foo/bar/baz/asdf'
于是我在源代码中去掉了 normalize 这个函数,发现 windows 下一切正常了,之所以加上 normalize 这个方法是为了过滤用户的相对路径故意注入,除去静态文件相对路径的漏洞。
为了验证这个问题我们在windows和linux下各跑如下脚本查看输出结果:
1、linux 系统下:
1 | var path = require('path'); |
输出:
1 | /usr/local/nodejs/test |
注意第二个输出:如果我们不过滤用户的../则直接让用户访问了 /usr/local/bin 目录了。
2、windows系统下:
1 | E:\node.js\test |
而rrestjs框架是根据反斜杠 “/” 来分割请求路径的,所以自然加了这个方法就出错了。
回顾在python语言中,我们可以利用:
1 | import os |
然后就可以根据结果返回值自定义不同的分隔符或者其他规则了。node.js的 normalize 这个函数也通过判断os来进行不同的处理的,以后大家开发跨系统的应用时,系统分隔符建议单独处理。