当前位置: 首页 > 科技观察

API查询语言GraphQL

时间:2023-03-12 04:49:13 科技观察

的良好安全实践【.com快译】GraphQL作为最流行的查询语言之一,可以支持创建灵活的API,但也容易放手,甚至给带来各种问题应用程序服务器。恶意查询。一些常见的GraphQL漏洞往往会在一致性评估和缺陷缓解方面埋下各种安全风险。在本文中,我们将与您深入探讨GraphQL的各种常见漏洞,以及降低此类风险的良好实践。什么是GraphQL?GraphQL作为服务端运行时(runtime)API查询语言,可以先返回客户端请求的数据。该语言不仅使API轻量灵活,而且对开发者非常友好,方便他们快速开发。作为RESTAPI框架的替代方案,GraphQL允许开发团队创建可以在单个接口调用中访问多个数据源的请求。该语言可以部署到集成开发环境(IDE)中,并提供用于描述用户应如何请求数据的语法。可以说,GraphQL不仅提供了可预测操作的框架,还允许开发者选择构建API的方式。GraphQL常见问题API攻击常见吗?随着API的使用越来越广泛,针对它们的攻击尝试不断增加。这些攻击通常依赖于通过应用程序编程接口进行各种恶意操作的自动化。据Wallarm.com统计报告显示,截至2019年,恶意自动攻击主机及其网络已占互联网的20%。这使得保护API成为应用程序安全措施的关键部分。有没有工具可以简化GraphQL的安全性?目前,业界有各种开源项目可以简化GraphQLAPI的创建和管理。这些包括:Apollo客户端、Offix、Graphback和OpenAPI-to-GraphQL。GraphQL如何处理身份验证和授权?由于GraphQL是一种服务器端运行时查询语言,它不处理授权逻辑。但是,该平台允许开发人员在将API暴露给客户端之前在业务逻辑层实现身份验证和授权检查。GraphQL的特定安全问题凭借其丰富的平台功能和简化API查询创建的能力,GraphQL被誉为现代应用程序开发堆栈的关键组件。为了帮助企业减少GraphQLAPI的攻击面,我们可以通过以下几个方面来控制GraphQL平台固有的安全问题:自定义标量验证不充分在使用GraphQL时,原始数据往往以标量类型表示。GraphQLAPI通常支持五种基本标量数据类型,即:Int、Float、Boolean、ID和String。虽然这个基础集对于简单的API来说已经足够了,但GraphQL还允许开发人员为特定的原始数据API类型需求创建自己的标量类型。当然,开发人员需要为此类配置添加额外的用户输入验证和清理过程。相反,未能实现此类功能会损害GraphQL标量类型的安全性。REST代理作为API攻击向量在调整现有API以供GraphQL客户端调用时,开发人员通常将GraphQL实现为内部REST框架之上的薄代理层。如果在没有充分安全考虑的情况下实施此类转换,恶意用户可以任意修改API请求中指定的路径或参数。当修改后的请求被解析到后端API时,攻击者就可以实现跨站请求伪造(cross-siterequestforgery,CSRF)。授权缺陷GraphQL将配置授权和身份验证检查的责任留给了最终实施者。也就是说,GraphQLAPI需要在查询级别的解析器中以及加载额外数据的解析器中包含多个授权检查。当授权由查询级解析器直接处理时,任何未经检查的API实例都会暴露攻击面。此外,随着API模式的复杂性增加,攻击者利用此类漏洞的风险也随之增加。内省查询(IntrospectionQueries)可能会暴露敏感数据开发者将启用GraphQL服务器之间的API端点通信,以实现不可公开访问的“隐藏”API端点,或通过隐藏的管理功能实现。其中,GraphQL包括一个内省功能,可以在没有适当授权的情况下轻松访问各种端点。由于内省功能允许客户端访问有关GraphQL模式的信息,因此在发生攻击时,内省查询可用于访问API相关配置和其他客户端私有信息。速率限制难以执行GraphQLAPI本质上是复杂的。它的每个查询都涉及多个操作,并且消耗大量的服务器资源。因此,仅仅限制接收到的HTTP请求的数量和使用默认的限速策略是不够的。如果两种对象类型之间存在循环关系,攻击者可以通过创建各种滥用查询来使查询本身变得极其复杂。由此产生的编排支持针对GraphQL应用程序的拒绝服务(DoS)攻击。GraphQL常见漏洞接下来,我们进一步讨论GraphQL在API层面可被恶意攻击者利用的常见漏洞。GraphQL批处理攻击GraphQL框架可以支持内省查询的批处理,即一次调用可以向后端API发送多个请求。这对于减少API请求的开销很有用,因为减少了请求和服务器之间的往返次数。然而,攻击者也可以使用查询批处理通过从API服务器或数据库重复加载数据来编排各种快速且难以检测的暴力攻击。以下典型示例显示了搜索数字记录对象标识(DROID)对象的不同实例时GraphQL批处理查询的代码:query{droid(id:"2000"){name}second:droid(id:"2001"){name}third:droid(id:"2002"){name}}并且攻击者可以通过发出一些网络请求来枚举API服务器中的每个droid对象。这可能会导致安全问题,例如API级DoS攻击、暴力破解机密数据、绕过请求速率限制和对象枚举。GraphQL注入攻击GraphQLAPI通常作为数据源与数据库管理系统交互。API后端的Resolver收到请求后,会根据操作集区分查询。Resolver在查询数据库时,如果其操作涉及数据提取,则直接执行相应的获取操作。可以看出,如果来自API客户端的数据在没有经过适当过滤的情况下执行任何可信操作,那么黑客就可以通过编排SQL/NoSQL来实施注入攻击。同样,如果输入的清理不充分,攻击者还可以执行其他形式的注入攻击,例如LDAP注入和命令注入。GraphQLCSRF攻击跨站请求伪造(CSRF)攻击是强制Web服务器在合法用户不知情的情况下执行不必要操作的攻击。当存在CSRF漏洞时,攻击者会在当前登录用户的上下文中发送经过身份验证的请求。GraphQL类型的应用程序极易受到CSRF攻击。毕竟,当API收到浏览器请求时,它会自动接受所有cookie(包括会话cookie)。目前,有两种主要类型的GraphQLCSRF攻击:基于Post的CSRF和基于Get的CSRF。由于GraphQL使用多个API层来转换传入的多格式请求并且会影响GraphQL应用程序的状态,因此大多数CSRF攻击通常针对POST请求。通常,许多开发人员只接受设置为application/json的Content-Type标头。例如,以下POST请求可用于发出有效的GraphQL查询:POST/GraphQLHTTP/1.1Host:redactedConnection:closeContent-Length:100accept:*/*User-Agent:...content-type:application/jsonReferer:https://redacted/Accept-Encoding:gzip,deflateAccept-Language:en-US,en;q=0.9Cookie:...{"operationName":null,"variables":{},"query":"{\nuser{\nfirstName\n__typename\n}\n}\n"}服务器可以接受此请求作为form-urlencodedPOST请求:POST/GraphQLHTTP/1.1Host:redactedConnection:closeContent-Length:72accept:*/*User-Agent:Mozilla/5.0(Macintosh;IntelMacOSX11_2_2)AppleWebKit/537.36(KHTML,likeGecko)Chrome/89.0.4389.82Safari/537.36Content-Type:application/x-www-form-urlencodedReferer:https://redactedAccept-Encoding:gzip,deflateAccept-Language:en-US,en;q=0.9Cookie:...query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A有经验的攻击者可以使用自动扫描工具将其转化为CSRF攻击接口:ChecklisttomakeGraphQL漏洞下面,我们将以清单的形式给出一些与GraphQL安全相关的良好实践。防止GraphQL注入攻击对于输入信息由LDAP、ORMs/SQL/NoSQL或XML等辅助解析器处理的应用,我们建议开发者执行以下操作:选择提供安全API的API,例如参数化语句库.根据所选解析器的最佳实践对输入进行转义或编码。按照所选模块的文档以正确的方式使用该工具。毕竟,大多数语言和框架都内置了编码/转义,因此了解它们的核心功能并选择适合您的用例的是很重要的。防止DoS攻击DoS攻击旨在使GraphQLAPI变慢甚至无法响应正常请求。为了抵御此类攻击,我们应该:对传入的GraphQL查询实施深度限制。添加了基础架构和API层的超时设置。执行查询的成本分析以限制昂贵的查询。对每个API客户端的传入请求实施速率限制。GraphQLAPI的访问控制为了保护对GraphQLAPI的合理访问,开发人员应该:验证当前用户有权根据他们的请求查看、更改和修改数据。在端点和边缘实施授权控制。访问控制是通过使用基于角色的访问控制(RBAC)中间件的查询和变异求解器实现的。在公共API中禁用内省查询。禁用像GraphiQL这样的GraphQL模式分析器。一般GraphQLAPI安全实践开发人员可以用来保护其GraphQL层的其他方法包括:对允许的字符使用白名单。相应的GraphQL模式是为突变输入预定义的。使用单一的内部字符编码格式来正确处理Unicode输入。添加分页以限制单个请求一次可以访问的信息量。原标题:BestPracticesForGraphQLSecurity,作者:SudipSengupta