Restify静态服务公开其他文件

时间:2014-04-27 21:16:54

标签: javascript node.js restify

我使用restify for node来创建一个简单的API。我希望有一个目录/public,人们只需浏览到该目录并下载他们浏览的文件即可。

为实现这一目标,我使用了/routes/public.js

server.get(/\/public\/?.*/, restify.serveStatic({
    directory: __dirname + '/../'
}));

因为我的文件结构如下:

index.js
/routes
    public.js
/public
    files
    to
    be
    served
然而,我注意到一个很大的安全问题。通过浏览http://domain.com/public/../index.js可以下载源代码!显然,我不希望这种情况发生。

这是一项权限工作还是我应该做的其他事情?感谢

1 个答案:

答案 0 :(得分:3)

Restify会检查以确保您没有提供指定目录之外的文件。您将静态文件的根目录指定为__dirname + '/../',它是应用程序的根目录。这意味着您的应用程序中的所有文件都可以通过静态提供。如果您只想要通过restify服务的./public/文件夹中的文件,则必须将其用作目录。

问题源于他们处理映射路由到静态文件的混乱(并且在我看来计划不当)。如您所述,完整路由包含在请求文件的路径中。这会导致像这样的尴尬局面。您有一个公用文件夹,并且还希望路由包含public。这意味着您必须拥有资源的./public/public文件夹。另一种方法是在您的路线中不包括公众。您可以像这样设置静态处理程序:

server.get(/.*/, restify.serveStatic({
  directory: './public/'
}));

然后对/somefile.txt的请求将路由到`./public/somefile.txt'。