繁体   English   中英

安全 rest api 节点 js

[英]Secure rest api node js

我想公开一个我找不到解决方案的问题,虽然我已经多次在 web 上被告知,但我找到的资源并不能满足我的好奇心。

问题如下:

假设我们在节点 js (express) 中有一个 rest API 在以下端点 -> / stars。 假设我们想将这个带有端点/星号的 API 出售给某个目标客户,那么端点将因此只允许购买 API 的客户使用它。 问题是自发出现的,假设披萨公司购买了我的 API 并且我为他们生成了访问令牌,然后他们会用他们的令牌调用我的端点以获得资源,到目前为止非常好。 但是,所有请求都很容易看到。

示例 Chrome> 开发工具> 网络,我不仅看到了具有完整地址的端点,甚至还看到了传递的有效负载!

因此,作为攻击者,我可以很好地(无需支付 API)使用带有令牌的端点/星号来捕捉披萨行业,复制所有内容并通过提供相同的令牌和相同的端点将其放在我的服务上。 我已经知道像 jwt 这样的令牌的存在,但它们无论如何都不能解决问题,因为不同的令牌只有过期。 即使它在 15 分钟或 3 分钟后过期,只需检索另一个并提供具有相同令牌的相同请求,谁能指导我找到解决方案?

我见过的唯一能找到解决方案的是 Instagram,它发送了数千行有效负载,这真的是唯一的方法吗?

注意:它甚至不公开。

@xVoid

  1. 首先,您可以借助 node.js 中的加密模块为您的响应数据设置一个加密/解密模块,在这里您发送加密响应,您的 API 客户端解密您的响应并使用它。

  2. 您可以为您的 API 设置一个密钥,这意味着每次您的客户或用户向您发送请求时,他们必须在正文中发送该密钥,而不是 header 以便其他人无法获取您的数据,因为他们没有那个密钥,并且在快递中你可以设置中间件来验证这个密钥是否存在,如果不是简单地返回“你没有被授权”

如果您没有任何意义,或者您想深入了解特定的事情,请告诉我

您可以简单地使用 http-only cookie 并在 cookie 中发送令牌,而不是普通的 header

使用您的端点的客户不应与最终用户共享其 API 密钥。

这意味着任何使用您的服务的客户都应该至少为您的特定端点创建一个代理服务器。

CLIENT GET /pizza FROM COSTUMER -> COSTUMER GET /pizza?apiToken=<...> FROM SERVICE

显然,在 COSTUMER 和您的 SERVICE 之间可能存在中间人攻击,但使用 SSL 不太可能发生这种情况(相关: HTTPS (HTTP + SSL) 中的查询字符串参数是否安全?

如果 COSTUMER 怀疑他们的 api 密钥被泄露,他们应该撤销它并向您的 SERVICE 请求一个新密钥。

当然,但如果我有一个 API 显示足球信息(仅限登录用户),那么登录就足够了,即使有验证码,拿 cookies 并将它们粘贴到 Z23EEEB4347BDD725DFC6B7EE9A3B 上where the API returns mine football data and have them available everywhere, it is true that the jwt expires, it is true that the sessions in php expire, it is true that the cookies are protected, but if I have the endpoint / getInfoFootBall accessible by通过 cookies ^ + 我的 API 访问令牌

  1. 我的 API 访问令牌肯定会在请求中公开。
  2. I can safely generate cookies by first logging in manually and then setting them on my python bot and putting them in the https request data result: I had access to the API even if for a few minutes (But I did...) - NB :在登录时添加验证码只能在最低限度内解决问题,因为如果我在网站上手动登录并在 python 机器人上插入我的 cookies,但是我会有一个成功的请求,我非常清楚这样的私人信息因为用户的电话号码或密码始终受到保护,因为用户永远看不到端点(因为大多数时候它是从管理面板调用的,所以除非管理员想要违反自己,否则它没有意义),但是我仍然可以访问甚至可能已售出 15 分钟的资源这一事实会造成不适,如果令牌不是公开的,肯定会有一个文件在某个点开始请求,其中可能使用 axios 将向 API 服务器发出请求,即使在这里我们有一个问题,也许 Z38C3787939C7B2B6C77DZ 请求将不可见,因为它完成了它8891从那里到服务器的域(我说 axios 举个例子),但是调用使用服务器端 axios 调用文件的端点就足够了......无论如何都没有办法告诉 ZDB9742387083CA8DE6FZACE www.siteofbuyer.net然后接受请求,否则丢弃它?

(我的可能只是一种无用的偏执狂,但实际上我描述的系统有效)

我写在这里是因为评论太长了

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM