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 <
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |