限制暴露其他文件的静态服务

我正在使用节点的restify来创build一个简单的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 + '/../' ,它是应用程序的根目录。 这意味着应用程序中的所有文件都可以通过静态方式提供。 如果您只想要./public/提供的./public/文件夹中的文件,则必须将其用作目录。

这个问题源于混淆(在我看来是糟糕的计划)他们处理映射路由到静态文件的方式。 正如你所说,完整的路线包含在所请求文件的path中。 这导致像这样的尴尬情况。 你有一个公共文件夹,也希望路线包括公共。 这意味着你必须有一个./public/public文件夹作为你的资源。 另一种方法是不要在你的路线上包括公众。 你可以像这样设置你的静态处理器:

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

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