主要观点:作者珍视“最少惊讶原则”和“提供合理默认值”,在 GraphQL 生态系统中发现很多违反这两个原则的情况,认为 GraphQL 默认是不安全的,存在信息泄露和拒绝服务等问题,同时介绍了使 GraphQL 端点默认安全的方法。
关键信息:
- GraphQL 默认不安全,有多个信息泄露和拒绝服务的漏洞,如 CVE-2022-37734 等,一些实现缺少默认的请求体大小限制等。
- 存在别名和指令重载等难以解决的问题,很多实现默认没有防护措施,一些流行框架虽有默认值但不完全。
- 许多 GraphQL 实现默认启用模式内省,容易导致信息泄露,需明确禁止。
- 以
graphql/graphql-js为例,通过添加body-parser限制请求体大小,设置默认验证规则和maxToken值,添加graphql-armor包的规则等可使端点默认安全,类似 RedwoodJS 的配置。
重要细节: graphql-java中通过设置配置的最大令牌数(包括空格)来修复拒绝服务漏洞,但graphql/graphql-js默认未设置限制。- 一些 GraphQL 实现默认未设置请求体大小限制,如
graphql-python/graphql-core和absinthe-graphql/absinthe。 graphql-armor包提供的规则可用于缓解多种安全问题,如设置exposeLimits为false防止泄露限制信息。- 最终的安全设置示例在
mble/graphql-tirefire仓库中。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。