GraphQL 已被最大的平台采用 - Facebook、Twitter、Github、Pinterest、Walmart - 这些大公司不能在安全性上妥协。但是,尽管 GraphQL 可以成为您的 API 的非常安全的选项,但它并不是开箱即用的。事实恰恰相反:即使是最新手的黑客,所有大门都是敞开的。此外,GraphQL 有自己的一套注意事项,因此如果您来自 REST,您可能会错过一些重要步骤!
2024 年,有关Hackerone 的报道仍在不断增加,只需阅读一下当 Watson 马来西亚的 API 被利用时听起来有多么容易:
首先,发现并枚举了一个 GraphQL API 端点。由于启用了自省功能,报告者可以看到所有可能的查询和突变。
接下来,研究人员可以使用名为 的突变创建自己的用户帐户Register
。此帐户允许访问 GraphQL API 中的一些经过身份验证的功能。
最后,借助经过身份验证的访问权限,研究人员使用名为 的突变提升了权限CreateAdminUser
。这可以访问 API 中的更多功能。
通过访问该特权账户,记者可以:
您必须绝对保护您的应用程序免受以下主要攻击类别的影响:
请注意,这些攻击非常基础,可以自动大规模执行。换句话说,无论您的应用程序是否成功或领域如何,您都很容易成为在数千个抓取的 API 端点上运行的脚本的目标。
希望有一些非常简单的策略可以保护你的 API。阅读更多内容以了解如何实施它们
大多数针对 GraphQL 的攻击都是从运行自省开始的 — 这是一个内置查询,可返回整个数据架构。任何人都可以确切知道 API 的有效查询和变异是什么,并据此发送攻击,直到他们发现漏洞。
此功能默认启用。如果可以(私有 API),请确保将其禁用。
你可以使用 GraphQL 框架(例如 Apollo)来实现
const server = new ApolloServer({
typeDefs,
resolvers,
introspection: process.env.NODE_ENV !== 'production'
});
或者你可以使用像graphql-disable-introspection这样的插件:
app.use("/graphql", bodyParser.json(), graphqlExpress({
schema: myGraphQLSchema,
validationRules: [NoIntrospection]
}));
GraphiQL 也是同样的事情。
另一个经典的 API 安全问题是访问控制。在大多数应用程序中,功能可根据您的身份验证状态和角色(用户、管理员)访问。
如果没有正确的授权检查层,将会向未经授权的用户暴露私人数据和更高级别的访问功能,例如在没有管理员角色的情况下删除资产。
在 REST 中,我们可以使用简单的中间件方法来保护 API 的所有子路由:
app.use('/api/admin', isAdmin())
在 GraphQL 中,我们可以使用上下文钩子执行同样的事情:
const server = new ApolloServer({
typeDefs,
resolvers,
context: async ({ req, res <