我使用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
可以下载源代码!显然,我不希望这种情况发生。
这是一项权限工作还是我应该做的其他事情?感谢
答案 0 :(得分:3)
Restify会检查以确保您没有提供指定目录之外的文件。您将静态文件的根目录指定为__dirname + '/../'
,它是应用程序的根目录。这意味着您的应用程序中的所有文件都可以通过静态提供。如果您只想要通过restify服务的./public/
文件夹中的文件,则必须将其用作目录。
问题源于他们处理映射路由到静态文件的混乱(并且在我看来计划不当)。如您所述,完整路由包含在请求文件的路径中。这会导致像这样的尴尬局面。您有一个公用文件夹,并且还希望路由包含public。这意味着您必须拥有资源的./public/public
文件夹。另一种方法是在您的路线中不包括公众。您可以像这样设置静态处理程序:
server.get(/.*/, restify.serveStatic({
directory: './public/'
}));
然后对/somefile.txt
的请求将路由到`./public/somefile.txt'。