如何在 DigitalOcean 中限制对 Express API 的访问

Posted

技术标签:

【中文标题】如何在 DigitalOcean 中限制对 Express API 的访问【英文标题】:How to limit access to Express API in DigitalOcean 【发布时间】:2020-11-12 09:10:33 【问题描述】:

我在 DigitalOceans 上有 2 个应用程序,一个 Express、API 和一个 React 应用程序。 React 应用程序从 API 获取数据。我想确保除了我的 React 应用程序之外没有人可以访问这个 API。我使用的是 Ubuntu 18.04。

我的 React 应用程序在 www.example.com 我的 API 位于 api.example.com

【问题讨论】:

您是否考虑过使用 API 密钥? 我想过,但我可以在哪里将 API 密钥存储在 react 应用程序中? 【参考方案1】:

您可以在 Express 中使用CORS,这是一种允许从域外的另一个域请求网页上受限资源的机制。

注意:我推荐这个,因为您的应用不需要登录。

首先,在后端安装库:

npm install cors

其次,设置允许的来源:

var express = require('express')
var cors = require('cors')
var app = express()

var corsOptions = 
  origin: 'http://example.com',
  optionsSuccessStatus: 200 // some legacy browsers (IE11, various SmartTVs) choke on 204


app.use(cors(corsOptions))

app.get('/products/:id', function (req, res, next) 
  res.json(msg: 'This is CORS-enabled for only example.com.')
)

app.listen(80, function () 
  console.log('CORS-enabled web server listening on port 80')
)

您可以在CORS Middleware中找到更多示例

【讨论】:

我已经实现了 CORS,感谢您提及。但是,我在一些网站上看到 CORS 可以轻松通过。这是真的吗? CORS 是一种机制,旨在允许代表您发出请求,同时阻止流氓 JS 发出的某些请求,并且在您向不同域/子发出 HTTP 请求时触发域/端口/协议。此机制可防止攻击者在各种网站上植入脚本(例如,在通过 Google Ads 显示的广告中)对 www.yourbank.com 进行 AJAX 调用,以防您使用 your 登录进行交易证书。浏览器将不允许 javascript 访问响应。 顺便说一句,你的 express api 将敏感数据暴露给前端? 不,这不是敏感数据,我实际上将它显示给用户。我已经在几个月内收集了一些数据,API 为它提供服务,但它是随机提供的。就像一个随机词生成器。我有一个类似字典的数据,我随机提供它。我想要的是因为收集这些数据花费了太长时间,我不想只是提供一个 API 让其他人使用它。我猜服务器端渲染很合适,但是我的页面需要刷新。【参考方案2】:

您需要研究请求授权方法。如果您只想要一个不考虑个人用户的简单请求授权系统,您可以在前端使用 auth 令牌创建一个环境变量,并在每个请求中发送它,然后仅在 authToken 匹配时才响应数据保存在您的后端。

如果您有多个用户使用您的应用,我建议您查看 JWT (https://jwt.io)

【讨论】:

该应用程序很简单,无需登录。我已经考虑添加一个环境变量,但是我认为身份验证令牌应该在某个无法访问的地方,而不是在 React 应用程序中 我建议使用 env var 的原因是这样您就不必在源代码中包含您的 authToken。对于您想要保密以防窥探的事情,这是一种常见的做法。将密钥存储在哪里并不重要,您需要的是一个密钥,该密钥随每个请求发送到服务器,并在后端进行验证,因此如果代码无效,您可以使用 403 响应,而不是发送数据。您可以对每个请求手动执行此操作(对秘密包含进行硬编码),也可以使用 axios 实例之类的东西自动将秘密添加到每个请求中

以上是关于如何在 DigitalOcean 中限制对 Express API 的访问的主要内容,如果未能解决你的问题,请参考以下文章

Exp9 WEB安全基础

Exp9 Web安全基础

asp中Replace待替换字符串有没有长度限制?

Exp9 Web安全基础实践 20164318 毛瀚逸

2018-2019-2 网络对抗技术 20165228 Exp9 Web安全基础实践

Exp9 Web安全基础实践 20154308张珊珊