小记文件服务器的漏洞修复
前一段时间用node.js写了一个简单的文件服务器,用于做项目时本地架设服务器满足客户端下载文件的需求(链接在这里)。
因为是用于本地的测试服务器,所以也没有怎么考虑安全性,直接根据url的路径去读取本地的目录和文件。今天想把文件服务器放到外网测试服务器上提供测试服务,部署之前对文件服务器做了下检查,结果发现,即使是文件服务器这么简单的逻辑,如果不考虑安全,也会导致以下2个漏洞:
- url指向绝对路径,如http://localhost/C:/。这种情况,通过path.isAbsolute判断直接阻止就行。
- url里面包含/../,如果http://localhost/..%2f。这种情况,可以通过正则表达式判断路径中存在类似/../的部分就直接阻止(express的serve-static就是这样做的)。我的做法是通过path.normalize规范化文件路径后,与根目录的路径进行比较,不是以根目录起始的直接阻止。
除了上面说的判断恶意输入进行阻止这种对症下药的做法外,还有一些其他方法:
- 限制服务器程序的权限,只具有根目录的读取权限。传统的服务器特别是linux下的服务器,大多都是采用这种方法。
- 不直接操作文件系统。例如可以在服务器启动时递归遍历根目录,把所有路径保存起来,接到请求时直接查表获得对应的文件路径(或内容),查表不存在就可以直接返回404。这种比较适合服务器运行时文件不会修改的情况,或者运行时动态生成文件。