Restify静态服务公开其他文件

Restify static serve exposing other files

本文关键字:其他 文件 静态 服务 Restify      更新时间:2023-09-26

我使用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,可以下载源代码!显然,我不希望这种情况发生。

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

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

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

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

则到/somefile.txt的请求将路由到"/public/somefile.txt'.