保护 Express API
Posted
技术标签:
【中文标题】保护 Express API【英文标题】:Securing Express API 【发布时间】:2018-04-28 03:09:23 【问题描述】:我正在编写一个前端和后端分开的网络应用程序。前端是用 React 编写的,后端是一个运行 Express 端点的 node.js 服务器。如何确保只有我的前端可以访问 API,其他任何人都不能访问?我的 API URL 暴露在我的前端客户端代码中,所以任何人都可以看到。
我向我的 API 添加了 JWT 身份验证,但我仍然需要一个不受保护的 /login 端点才能生成 JWT 令牌,并且为了登录以生成令牌,我必须从我的前端,其他用户可以看到,因为它是从客户端完成的。
保护托管在这样的单独后端上的 API 的正确方法是什么,以便只有我的前端可以访问它,而没有人可以看到正在使用哪些凭据来访问端点?
【问题讨论】:
你不能。您的 API 在互联网上。任何人都可以访问它。在允许访问 API 之前,您可以要求该帐户的帐户和登录凭据,但是一旦有人拥有帐户和凭据,他们就可以从自己的脚本而不是通过您的网页访问 API。这就是网络的工作方式。您对此无能为力。并且无法隐藏客户端正在使用的凭据。客户端上的所有数据都可以被客户端上的黑客查看。这就是网络的方式。 哦,我明白了。这就说得通了。公司一般如何处理这个问题?例如,对于像 Reddit 这样的网站,我敢肯定,如果黑客获得了 API 凭据,他们将很容易发布一百万个帖子。凭证通常如何存储?现在它们实际上只是在我的客户端代码中。 大公司通常会监控其 API 使用情况,以寻找不当使用。这包括速率限制、检测非普通用户典型的行为和序列。当他们发现不当使用时,他们通常会暂时或永久禁止违规帐户。这也是为什么一些页面使用技术来检测是否是一个真正的人单独导致了诸如 reCaptcha 之类的操作。 啊,我明白了。这些绝对看起来像是保护 API 的一些很好的理智措施。在存储实际凭据以从我的前端访问 API 方面,您认为将它们存储在 JSON 文件中然后将该文件加载到客户端变量中是否可以?或者有没有办法让人们轻松查看我的客户端文件的内容? 我不知道你在想什么在本地存储凭据,但如果这是在浏览器中运行的 javascript(我假设你的意思是 React 前端),那么 Javascript 不会有权访问文件系统。您可以使用 cookie 或本地存储或更新的存储 API,如 IndexdDB API。 【参考方案1】:你不能。您的 API 在互联网上。任何人都可以访问它。在允许访问 API 之前,您可以要求该帐户的帐户和登录凭据,但是一旦有人拥有帐户和凭据,他们就可以从自己的脚本而不是通过您的网页访问 API。这就是网络的工作方式。您对此无能为力。并且无法隐藏客户端正在使用的凭据。客户端上的所有数据都可以被客户端上的黑客查看。这就是网络的方式。
较大的公司通常会监控其 API 使用情况以寻找不当使用。这包括速率限制、检测非普通人类用户典型的行为和序列。当他们检测到不当使用时,他们通常会暂时或永久禁用该操作或禁止违规帐户。这也是为什么某些页面使用技术来检测是否是真实的人单独导致了诸如 reCaptcha 之类的操作。例如,在堆栈溢出时,在编辑 cmets 或帖子时,我经常遇到速率限制,它告诉我必须稍等片刻才能接受我的编辑。
没有绝对安全的方法可以在客户端中存储凭据。最常见的凭证方案是要求用户名和密码(通过 https 安全),然后当服务器上接受它作为合法凭证时,会向客户端发出某种令牌,可用于未来的 API 调用。该令牌可能位于 cookie 中,也可能需要手动包含在每个后续 API 调用中(从浏览器使用 API 时 cookie 的优势在于 cookie 会随每个后续请求自动发送)。
如果令牌是 cookie,则 cookie 存储在浏览器的 cookie 存储中,并且可以为其设置过期时间。浏览器的 cookie 存储受到保护,不会被其他站点的网页访问,但可以被本地计算机上的某人访问(它存储在文件系统中)。
如果令牌不是 cookie,只是作为令牌返回,并且客户端希望存储它,那么 Javascript 还提供了一些其他位置来存储它。本地存储具有与 cookie 存储类似的安全性。它受到保护,不会被其他网站访问,但可以由本地计算机上的人访问。
【讨论】:
以上是关于保护 Express API的主要内容,如果未能解决你的问题,请参考以下文章
保护 Express 免受 XSS:对整个传入请求的 HTML 实体进行编码是不是足够?
使用 express js、passport s 保护 GraphQL 查询