NodeJS/express - 公共 API 端点的安全性

Posted

技术标签:

【中文标题】NodeJS/express - 公共 API 端点的安全性【英文标题】:NodeJS/express - security for public API endpoint 【发布时间】:2015-12-24 08:58:29 【问题描述】:

我正在开发基于 NodeJs/Express 的网站项目,并且对于某些 UI 部分,我使用 Jquery ajax 请求来获取辅助数据。

我们如何处理对浏览器用于 ajax 调用的 Rest API 端点的一些基本控制? 我在考虑某种令牌授权,但是一旦它被拦截,其他客户端(脚本等)也可以使用它,那么我们如何保护我们的服务器免受不需要的请求呢?在这种情况下应该使用哪些其他控件(识别来自同一客户端的太多请求、客户端黑名单等)?

【问题讨论】:

【参考方案1】:

共有三个主要主题身份验证、授权、安全性。我会给出链接,并且只会给出简短的答案。主题足够大,可以写几本书。

身份验证 - 谁是发出请求的人。认证用户有很多“策略”。请检查最流行的模块:http://passportjs.org/docs。

当然,您可以单独实施一种或多种这种策略。

对于无状态身份验证,jwt 令牌非常方便。如果您想自己编写代码(Passport 有此策略),请查看此链接(网络中的众多链接之一)https://scotch.io/tutorials/authenticate-a-node-js-api-with-json-web-tokens。

如何防止令牌拦截?始终使用 https 并将令牌过期时间设置为短。

在哪里存储您的令牌客户端?有关详细信息,请查看https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/ 简而言之,由于 XSS 攻击,请不要将其存储在 Web 存储中。使用 cookie,如果配置正确,它们是安全的(更多信息见附加链接),如果未配置,它们很容易受到威胁。

授权:我们知道用户,但他只能访问某些资源。请查看https://github.com/OptimalBits/node_acl node_acl 和护照有要点:https://gist.github.com/danwit/e0a7c5ad57c9ce5659d2 简而言之,护照验证用户。我们现在谁想要什么。我们设置角色和资源并定义角色和资源关系。然后我们为每个用户设置角色。模块将检查我们的用户权限。

安全性:请在sails 框架http://sailsjs.org/documentation/concepts/security 的文档中查找此主题,它们描述了攻击以及框架如何防止它们形成。我写的是快递:

DDOS:(您的部分问题“来自同一客户端的请求过多”)“在 API 层,没有太多可以预防的方法”。这是服务器管理员最关心的问题。总之使用负载均衡器。如果是一个 IP(不是数百个),则将其列入黑名单或删除响应(开始查看此https://www.npmjs.com/package/delayed-request,但我认为该解决方案必须更复杂)。

CSRF:“强制最终用户在 Web 应用程序后端执行不需要的操作的攻击类型”。看这个模块https://www.npmjs.com/package/csrf

XSS:“恶意代理设法将客户端 javascript 注入您的网站的攻击类型”不信任来自用户的任何数据。始终验证、过滤、清理。看看这个https://www.npmjs.com/package/xss

在风帆的文档中,有更多的攻击类型,但以上是最受欢迎的。

【讨论】:

那么如果我们的页面是公开的,不需要任何用户认证,就没有办法阻止任何外部调用REST API? 'public' 意味着对所有人开放,那么对你来说,'external' call 是什么意思? 在网站上下文之外使用,所以假设不是来自我编写的代码。 您有一些客户端脚本,它们应该可以访问您的后端 api,但应该阻止其他站点/服务器? 我认为这是不可能的。当某些东西在客户端时,它不在您的服务器上,而是在您的用户计算机上。当然,您可以使用 CORS 阻止来自其他网站的请求,但这并不符合您的需求。【参考方案2】:

使用快速会话 + 护照 (http://passportjs.org/) 基本上,您应该登录网站,并且只有经过身份验证的用户才能调用 REST api。 现在...如果您不想登录,那么您将无法真正保护 API,因为网站的设计是开放的。 您没有指定太多信息,因此很难说更多。

您的代码也无法保护 DoS 攻击,并且通常不是应用服务器(在您的情况下为 node.js express)提供此类保护的责任。如果有人希望通过 DoS 攻击来关闭您的网站,而不是没有其他层(请参阅https://en.wikipedia.org/wiki/Denial-of-service_attack#Defense_techniques),这主要意味着它取决于路由器/交换机/等等......来实现。

【讨论】:

以上是关于NodeJS/express - 公共 API 端点的安全性的主要内容,如果未能解决你的问题,请参考以下文章

如何在 nodejs express 重定向上启用 CORS?

在 NodeJS/Express 中使用 API 网关进行微服务 API 身份验证

API 中未显示数据(NodeJS + Express)

NodeJs+Express+SqlServer简易后台API服务搭建

使用异步和请求包(NodeJS / Express)进行多个 API 调用

vue+express+mongodb搭建移动端网站