GraphQL 是一种查询语言,用于在客户端和服务器之间进行数据交互。它已经逐渐成为前端开发中的热门技术,因其灵活性和强大的查询能力而备受推崇。然而,如何在服务器上安全使用 GraphQL 构建应用是一个值得深入讨论的话题。
为什么安全性很重要
虽然 GraphQL 本身很安全,但是它需要在服务器端进行有效的编写和配置,以保护您的应用不受恶意攻击。服务器应该验证和授权所有的查询和突变,以避免安全漏洞和数据泄露。
如何保护 GraphQL 服务
以下是几种保护 GraphQL 服务的建议。
限制访问
GraphQL 提供了很多查询和突变的功能,服务器应该缩小访问范围,只允许授权的用户或 API 使用者进行查询。您可以使用 token 或 cookie 对用户进行鉴权,或使用 IP 白名单、CORS、Firewall 等防火墙进行筛选。
例如,以下是 Node.js 中的 GraphQL 设置,以确保只有经过身份验证的用户才能对查询进行授权。
app.use('/graphql', (req, res, next) => { if(!req.cookies['token']) { res.status(401).send('Unauthorized'); return; } // 其他身份验证逻辑... next(); });
限制查询结果
GraphQL API 中提供了一个特别强大的功能,使应用能够灵活制定查询并仅获得所需数据。但是,如果不限制查询结果,就有可能产生负效应。例如,在查询中使用嵌套查询并抑制深度的限制(maximum depth)时,黑客可能会使用循环的方式查询其他数据来消耗系统资源。因此,在服务器端应该设置合适的查询限制(query limit)和深度限制来保护应用程序。
例如,在 Apollo Server 中,有一个名为 depthLimit
的函数可以限制查询的深度。
const server = new ApolloServer({ typeDefs, resolvers, validationRules: [depthLimit(5)], });
静态查询
GraphQL 在编写查询时有一个称为静态查询的过程。将 GraphQL 查询编写成静态查询可以让查询成为缓存的组件,从而减少了执行查询的时间。合理使用静态查询,不仅能提高性能,还有助于安全方面的问题。
例如,在应用程序中将查询从字符串形式更改为常量形式来创建静态查询。
const USERS_QUERY = gql` query getUsers { users { id name email } }`;
防止拒绝服务攻击
GraphQL 服务本身非常容易遭到拒绝服务攻击。黑客可以使用深度查询或复杂查询,以消耗系统资源并使应用停止响应。因此,应该在服务器端设置适当的查询速度临界值,以便防止此类攻击。
例如,在 Apollo Server 中,如果查询时间超出设定的限制时间,则会自动终止执行查询的过程。
-- -------------------- ---- ------- ----- ------ - ---------------------- --------- ---------- ----------------- - --------- -------------------------- -- --- ----- ------ - --- -------------- ------- --- ------------------------ ---- ----- ----------- ---
结论
GraphQL 提供了强大和灵活的查询能力,但是在使用时要十分注意安全性。在服务器端进行有效的编写和配置,以保护应用不受恶意攻击,是保证 GraphQL 访问安全的关键所在。以上建议有助于防止几种常见的攻击,并帮助您确保 GraphQL 服务的安全。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66fa547f44713626014b731d