【问题标题】:Restify static serve exposing other filesRestify 静态服务暴露其他文件
【发布时间】:2014-04-29 02:52:20
【问题描述】:

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

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

【问题讨论】:

  • 您确定正确设置了目录值吗?不应该是 `directory: __dirname + '/public/' 吗?
  • 在阅读文档和另一个 SO 答案后,directory 是路径的前缀,因此设置 __dirname + '/public' 将采用路径 /routes/public/public/filestobeserved。我已经尝试更改静态文件目录,但我仍然可以通过在 url 中包含 ../ 来上文件夹。
  • 根据restify文档,提供的路径已经是相对于正在运行的进程位置。在这种情况下,您只需要'./public/'。无论如何,正如你所说,这不是你的问题的原因。我将在下面提交答案。

标签: javascript node.js restify


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 2016-03-25
    • 2016-02-11
    相关资源
    最近更新 更多