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

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

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

【问题讨论】:

    标签: node.js ajax rest api express


    【解决方案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),这主要意味着它取决于路由器/交换机/等等......来实现。

    【讨论】:

      猜你喜欢
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      • 2011-01-29
      • 2020-03-28
      相关资源
      最近更新 更多