Next.JS目录结构和 JSON 机密的安全性

Next.JS security of directory structure and JSON secrets

提问人:Sharp Dev 提问时间:5/21/2022 更新时间:5/28/2022 访问量:1073

问:

我有一个关于Next.JS目录的访问及其访问要求的安全问题。
我有一个根文件夹,里面有我的页面、public、src、styles、models 文件夹。

在 src 文件夹中,我有一个空的 JavaScript 对象的settings.json文件。这个想法是将设置添加到此文件中并由 api 路由访问,以检查可以在此settings.json文件上修改的设置......
我想知道的是客户端是否真的可以以某种方式读取/访问 src 目录并获取settings.json文件。
我想把密钥放在这里,这样我就可以轻松更改密钥,而无需重新启动服务器。因此,我可以实时更新密钥,并将其应用于settings.json文件。然后更新将立即生效,我不必更改环境变量并重新启动服务器。
在 src 目录中保留和使用 json 文件来存储机密数据是否安全?如果没有,有没有办法为此目的保留和使用 json 文件? 感谢您的帮助和信息。

服务器端 访问控制 next.js 安全性

评论

0赞 juliomalves 5/23/2022
客户端代码将无法访问服务器上的目录或文件,除非您显式提供执行此操作的方法。“设置将添加到此文件并由 API 路由访问” - 这可能会通过 API 路由向客户端公开文件。
0赞 Sharp Dev 5/24/2022
@juliomalves,是的,当然,它可以“潜在地”将文件暴露给客户端.....但是,例如,.env 文件可以在服务器上作为 process.env.VARIABLE 访问。它和 .env 文件一样安全吗?
0赞 juliomalves 5/24/2022
是的,这将保持安全。 无法从客户端访问。process.env.VARIABLE
0赞 Sharp Dev 5/24/2022
@juliomalves是的,我知道 process.env.VARIABLE 无法从客户端访问,但就像我说的......所以我有一个 .env 文件(客户端无法访问该文件),但是如果我将一个 settings.json 文件放在该 .env 文件旁边并在 api 路由中需要它,客户端是否可以以某种方式下载该settings.json文件,而无需我故意向他们发送内容/文件本身?
0赞 juliomalves 5/24/2022
不,如果没有您在 API 路由中故意这样做,客户端将无法这样做。

答:

1赞 MPawlak 5/28/2022 #1

正如juliomalves所指出的,客户端代码将无法访问服务器上的目录或文件,但公共目录除外。

Next 使您能够从此处所述提供静态资产[root]/public

注意:Next.js只会提供构建时公共目录中的资产。

如果此目录被重命名,则这些资产将不再可从客户端获得。

注意:不要将公共目录命名为其他任何名称。该名称无法更改,并且是用于提供静态资产的唯一目录。

“我把一个settings.json文件放在那个 .env 文件旁边,并在 api 路由中要求它,客户端是否可以以某种方式下载该settings.json文件,而无需我故意向他们发送内容/文件本身?”

从 api 路由提供信息的唯一方法是明确创建一个路由来调用(或)使用从该文件导入的数据。Api 路由从未捆绑在客户端,而只存在于服务器上,如此所述。res[ponse].send()res.json()

文件夹 pages/api 中的任何文件都映射到 /api/*,并将被视为 API 端点而不是页面。它们是仅限服务器端的捆绑包,不会增加客户端捆绑包的大小。

“我想知道的是,客户端是否真的可以以某种方式读取/访问 src 目录并获取settings.json文件。”

如上所述,只有目录中的资产才能通过路径作为文件进行访问。在 Next 中,目录永远无法作为静态资产进行访问。甚至在源代码中也指出了这一点。/public

send(req, path)
  .on('directory', () => {
    // We don't allow directories to be read.
    const err: any = new Error('No directory access')
    err.code = 'ENOENT'
    reject(err)
  })