注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

snoopyxdy的博客

https://github.com/DoubleSpout

 
 
 

日志

 
 

node.js中normalize引出的坑  

2012-10-24 20:04:00|  分类: node |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
最近在某个创业公司使用 rrestjs 框架中碰到一个问题,更新到0.9.x版本的rreestjs框架后,在windows下无法正常分割用户的请求,导致他们公司的项目无法正常开发了。收到这个消息,我也很纳闷,因为之前在0.8.x时并没有出现这个问题,而且我还特别写了单元测试代码,当然那些代码主要是在linux下跑测试的。
对比0.9和0.8版本之间的主要req.path那块代码的区别是,我把用户的请求路径通过了这个函数:path.normalize(p),官方给这个函数的示例是:

path.normalize('/foo/bar//baz/asdf/quux/..')
// returns
'/foo/bar/baz/asdf'


于是我在源代码中去掉了  normalize  这个函数,发现 windows 下一切正常了,之所以加上  normalize 这个方法是为了过滤用户的相对路径故意注入,除去静态文件相对路径的漏洞。

为了验证这个问题我们在windows和linux下各跑如下脚本查看输出结果:
1、linux 系统下:

var path = require('path');
var url = '/aaa/bbb/ccc/../../../../../../../usr/local/bin';
var url1 = path.normalize(url);
console.log(__dirname);
console.log(path.join(__dirname, url));
console.log(path.join(__dirname, url1));

 输出:

/usr/local/nodejs/test
/usr/local/bin
/usr/local/nodejs/test/usr/local/bin

注意第二个输出:如果我们不过滤用户的../则直接让用户访问了 /usr/local/bin 目录了。

2、windows系统下:

E:\node.js\test
E:\usr\local\bin
E:\node.js\test\usr\local\bin

而rrestjs框架是根据反斜杠 “/” 来分割请求路径的,所以自然加了这个方法就出错了。
回顾在python语言中,我们可以利用:

import os
os.sep //这里会根据系统的不同的路径分隔符,比如windows出现"\" linux出现"/"

而在node.js中os模块式没有这个属性的,只能自给自足了, node.js提供了 os.platform() 或者 process.platform 

os.platform 

process.platform 

 'darwin', 'freebsd', 'linux', 'sunos' or 'win32'

然后就可以根据结果返回值自定义不同的分隔符或者其他规则了。node.js的 normalize 这个函数也通过判断os来进行不同的处理的,以后大家开发跨系统的应用时,系统分隔符建议单独处理。

最后广告时间:
高性能roa & restful node.js开发框架rrestjs,给您除了expressjs意外的全新体验:
基于rrestjs框架开发的轻博客:www.wujb.net



  评论这张
 
阅读(1058)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016