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

相关文章

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

在Java中使用OpenCV实践

《在Java中使用OpenCV实践》用户分享了在Java项目中集成OpenCV4.10.0的实践经验,涵盖库简介、Windows安装、依赖配置及灰度图测试,强调其在图像处理领域的多功能性,并计划后续探... 目录前言一 、OpenCV1.简介2.下载与安装3.目录说明二、在Java项目中使用三 、测试1.测

MyBatis-Plus 自动赋值实体字段最佳实践指南

《MyBatis-Plus自动赋值实体字段最佳实践指南》MyBatis-Plus通过@TableField注解与填充策略,实现时间戳、用户信息、逻辑删除等字段的自动填充,减少手动赋值,提升开发效率与... 目录1. MyBATis-Plus 自动赋值概述1.1 适用场景1.2 自动填充的原理1.3 填充策略

Olingo分析和实践之EDM 辅助序列化器详解(最佳实践)

《Olingo分析和实践之EDM辅助序列化器详解(最佳实践)》EDM辅助序列化器是ApacheOlingoOData框架中无需完整EDM模型的智能序列化工具,通过运行时类型推断实现灵活数据转换,适用... 目录概念与定义什么是 EDM 辅助序列化器?核心概念设计目标核心特点1. EDM 信息可选2. 智能类

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

Olingo分析和实践之ODataImpl详细分析(重要方法详解)

《Olingo分析和实践之ODataImpl详细分析(重要方法详解)》ODataImpl.java是ApacheOlingoOData框架的核心工厂类,负责创建序列化器、反序列化器和处理器等组件,... 目录概述主要职责类结构与继承关系核心功能分析1. 序列化器管理2. 反序列化器管理3. 处理器管理重要方

虚拟机Centos7安装MySQL数据库实践

《虚拟机Centos7安装MySQL数据库实践》用户分享在虚拟机安装MySQL的全过程及常见问题解决方案,包括处理GPG密钥、修改密码策略、配置远程访问权限及防火墙设置,最终通过关闭防火墙和停止Net... 目录安装mysql数据库下载wget命令下载MySQL安装包安装MySQL安装MySQL服务安装完成

SpringBoot整合(ES)ElasticSearch7.8实践

《SpringBoot整合(ES)ElasticSearch7.8实践》本文详细介绍了SpringBoot整合ElasticSearch7.8的教程,涵盖依赖添加、客户端初始化、索引创建与获取、批量插... 目录SpringBoot整合ElasticSearch7.8添加依赖初始化创建SpringBoot项

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤

Nginx安全防护的多种方法

《Nginx安全防护的多种方法》在生产环境中,需要隐藏Nginx的版本号,以避免泄漏Nginx的版本,使攻击者不能针对特定版本进行攻击,下面就来介绍一下Nginx安全防护的方法,感兴趣的可以了解一下... 目录核心安全配置1.编译安装 Nginx2.隐藏版本号3.限制危险请求方法4.请求限制(CC攻击防御)