9 个 GraphQL 安全最佳实践

打印 上一主题 下一主题

主题 919|帖子 919|积分 2761

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)来实现
  1. <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>
  2.   typeDefs<span style="color:#999999">,</span>
  3.   resolvers<span style="color:#999999">,</span>
  4.   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>
  5. <span style="color:#999999">}</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
  6. </code></span></span>
复制代码
大概你可以使用像graphql-disable-introspection这样的插件:
  1. <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>
  2.         schema<span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">:</span></span> myGraphQLSchema<span style="color:#999999">,</span>
  3.         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>
  4. <span style="color:#999999">}</span><span style="color:#999999">)</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
  5. </code></span></span>
复制代码
GraphiQL 也是同样的事变。
2.通过授权和身份验证限定访问控制

另一个经典的 API 安全问题是访问控制。在大多数应用程序中,功能可根据您的身份验证状态和脚色(用户、管理员)访问。
如果没有准确的授权查抄层,将会向未经授权的用户袒露私人数据和更高级别的访问功能,例如在没有管理员脚色的环境下删除资产。
在 REST 中,我们可以使用简朴的中间件方法来保护 API 的所有子路由:
  1. <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>
  2. </code></span></span>
复制代码
在 GraphQL 中,我们可以使用上下文钩子执行同样的事变:
  1. <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>
  2.     typeDefs<span style="color:#999999">,</span>
  3.     resolvers<span style="color:#999999">,</span>
  4.     <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 <
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王國慶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表