9 个 GraphQL 安全最佳实践

2024-06-24 12:28
文章标签 最佳 实践 安全 graphql

本文主要是介绍9 个 GraphQL 安全最佳实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

GraphQL 已被最大的平台采用 - Facebook、Twitter、Github、Pinterest、Walmart - 这些大公司不能在安全性上妥协。但是,尽管 GraphQL 可以成为您的 API 的非常安全的选项,但它并不是开箱即用的。事实恰恰相反:即使是最新手的黑客,所有大门都是敞开的。此外,GraphQL 有自己的一套注意事项,因此如果您来自 REST,您可能会错过一些重要步骤!

2024 年,有关Hackerone 的报道仍在不断增加,只需阅读一下当 Watson 马来西亚的 API 被利用时听起来有多么容易:

首先,发现并枚举了一个 GraphQL API 端点。由于启用了自省功能,报告者可以看到所有可能的查询和突变。
接下来,研究人员可以使用名为 的突变创建自己的用户帐户 Register。此帐户允许访问 GraphQL API 中的一些经过身份验证的功能。
最后,借助经过身份验证的访问权限,研究人员使用名为 的突变提升了权限 CreateAdminUser。这可以访问 API 中的更多功能。

通过访问该特权账户,记者可以:

  • 可以使用 GraphQL API 中的许多功能
  • 可以修改最终出现在电子商务网站首页的横幅广告
  • 可以修改促销产品的特征(价格、图片等)。

有什么风险

您必须绝对保护您的应用程序免受以下主要攻击类别的影响:

  • 注入(SQL、XSS、CCS 等)——使用意外/随机输入导致应用程序崩溃或访问私人数据
  • 访问控制——对查询和修改的限制过于宽松,允许任何人在没有必要角色的情况下采取行动
  • 暴力攻击——提交大量(泄露的)凭证,希望猜对
  • DoS(拒绝服务)——淹没你的 API 并使其崩溃
  • CSRF——诱导用户通过点击 API 的恶意链接执行不必要的操作
请注意,这些攻击非常基础,可以自动大规模执行。换句话说,无论您的应用程序是否成功或领域如何,您都很容易成为在数千个抓取的 API 端点上运行的脚本的目标。

希望有一些非常简单的策略可以保护你的 API。内容以了解如何实施它们 👇

1. 自省

大多数针对 GraphQL 的攻击都是从运行自省开始的 — 这是一个内置查询,可返回整个数据架构。任何人都可以确切知道 API 的有效查询和变异是什么,并据此发送攻击,直到他们发现漏洞。

此功能默认启用。如果可以(私有 API),请确保将其禁用。

你可以使用 GraphQL 框架(例如 Apollo)来实现

<span style="background-color:#f5f2f0"><span style="color:#000000"><code class="language-jsx"><span style="color:#0077aa">const</span> server <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">=</span></span> <span style="color:#0077aa">new</span> <span style="color:#dd4a68">ApolloServer</span><span style="color:#999999">(</span><span style="color:#999999">{</span>typeDefs<span style="color:#999999">,</span>resolvers<span style="color:#999999">,</span>introspection<span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">:</span></span> process<span style="color:#999999">.</span>env<span style="color:#999999">.</span><span style="color:#990055">NODE_ENV</span> <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">!==</span></span> <span style="color:#669900">'production'</span>
<span style="color:#999999">}</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
</code></span></span>

或者你可以使用像graphql-disable-introspection这样的插件:

<span style="background-color:#f5f2f0"><span style="color:#000000"><code class="language-jsx">app<span style="color:#999999">.</span><span style="color:#dd4a68">use</span><span style="color:#999999">(</span><span style="color:#669900">"/graphql"</span><span style="color:#999999">,</span> bodyParser<span style="color:#999999">.</span><span style="color:#dd4a68">json</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">,</span> <span style="color:#dd4a68">graphqlExpress</span><span style="color:#999999">(</span><span style="color:#999999">{</span>schema<span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">:</span></span> myGraphQLSchema<span style="color:#999999">,</span>validationRules<span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">:</span></span> <span style="color:#999999">[</span>NoIntrospection<span style="color:#999999">]</span>
<span style="color:#999999">}</span><span style="color:#999999">)</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
</code></span></span>

GraphiQL 也是同样的事情。

2.通过授权和身份验证限制访问控制

另一个经典的 API 安全问题是访问控制。在大多数应用程序中,功能可根据您的身份验证状态和角色(用户、管理员)访问。

如果没有正确的授权检查层,将会向未经授权的用户暴露私人数据和更高级别的访问功能,例如在没有管理员角色的情况下删除资产。

在 REST 中,我们可以使用简单的中间件方法来保护 API 的所有子路由:

<span style="background-color:#f5f2f0"><span style="color:#000000"><code class="language-jsx">app<span style="color:#999999">.</span><span style="color:#dd4a68">use</span><span style="color:#999999">(</span><span style="color:#669900">'/api/admin'</span><span style="color:#999999">,</span> <span style="color:#dd4a68">isAdmin</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">)</span>
</code></span></span>

在 GraphQL 中,我们可以使用上下文钩子执行同样的事情:

<span style="background-color:#f5f2f0"><span style="color:#000000"><code class="language-jsx"><span style="color:#0077aa">const</span> server <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">=</span></span> <span style="color:#0077aa">new</span> <span style="color:#dd4a68">ApolloServer</span><span style="color:#999999">(</span><span style="color:#999999">{</span>typeDefs<span style="color:#999999">,</span>resolvers<span style="color:#999999">,</span><span style="color:#dd4a68">context</span><span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">:</span></span> <span style="color:#0077aa">async</span> <span style="color:#999999">(</span><span style="color:#999999">{</span> req<span style="color:#999999">,</span> res <

这篇关于9 个 GraphQL 安全最佳实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1090144

相关文章

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

springboot集成Deepseek4j的项目实践

《springboot集成Deepseek4j的项目实践》本文主要介绍了springboot集成Deepseek4j的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录Deepseek4j快速开始Maven 依js赖基础配置基础使用示例1. 流式返回示例2. 进阶

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

Spring Boot中定时任务Cron表达式的终极指南最佳实践记录

《SpringBoot中定时任务Cron表达式的终极指南最佳实践记录》本文详细介绍了SpringBoot中定时任务的实现方法,特别是Cron表达式的使用技巧和高级用法,从基础语法到复杂场景,从快速启... 目录一、Cron表达式基础1.1 Cron表达式结构1.2 核心语法规则二、Spring Boot中定

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统

Ubuntu中Nginx虚拟主机设置的项目实践

《Ubuntu中Nginx虚拟主机设置的项目实践》通过配置虚拟主机,可以在同一台服务器上运行多个独立的网站,本文主要介绍了Ubuntu中Nginx虚拟主机设置的项目实践,具有一定的参考价值,感兴趣的可... 目录简介安装 Nginx创建虚拟主机1. 创建网站目录2. 创建默认索引文件3. 配置 Nginx4

Nginx实现高并发的项目实践

《Nginx实现高并发的项目实践》本文主要介绍了Nginx实现高并发的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用最新稳定版本的Nginx合理配置工作进程(workers)配置工作进程连接数(worker_co