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

相关文章

SQLite3命令行工具最佳实践指南

《SQLite3命令行工具最佳实践指南》SQLite3是轻量级嵌入式数据库,无需服务器支持,具备ACID事务与跨平台特性,适用于小型项目和学习,sqlite3.exe作为命令行工具,支持SQL执行、数... 目录1. SQLite3简介和特点2. sqlite3.exe使用概述2.1 sqlite3.exe

mtu设置多少网速最快? 路由器MTU设置最佳网速的技巧

《mtu设置多少网速最快?路由器MTU设置最佳网速的技巧》mtu设置多少网速最快?想要通过设置路由器mtu获得最佳网速,该怎么设置呢?下面我们就来看看路由器MTU设置最佳网速的技巧... 答:1500 MTU值指的是在网络传输中数据包的最大值,合理的设置MTU 值可以让网络更快!mtu设置可以优化不同的网

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Springboot整合Redis主从实践

《Springboot整合Redis主从实践》:本文主要介绍Springboot整合Redis主从的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言原配置现配置测试LettuceConnectionFactory.setShareNativeConnect

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

java中Optional的核心用法和最佳实践

《java中Optional的核心用法和最佳实践》Java8中Optional用于处理可能为null的值,减少空指针异常,:本文主要介绍java中Optional核心用法和最佳实践的相关资料,文中... 目录前言1. 创建 Optional 对象1.1 常规创建方式2. 访问 Optional 中的值2.1

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

pytest+allure环境搭建+自动化实践过程

《pytest+allure环境搭建+自动化实践过程》:本文主要介绍pytest+allure环境搭建+自动化实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、pytest下载安装1.1、安装pytest1.2、检测是否安装成功二、allure下载安装2.

使用vscode搭建pywebview集成vue项目实践

《使用vscode搭建pywebview集成vue项目实践》:本文主要介绍使用vscode搭建pywebview集成vue项目实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录环境准备项目源码下载项目说明调试与生成可执行文件核心代码说明总结本节我们使用pythonpywebv