问题 为什么在客户端编写GraphQL查询是安全的?


GraphQL 最近发布了,似乎鼓励在客户端编写查询。

  1. 是什么使得在客户端编写GraphQL查询安全,而不是SQL查询?
  2. GraphQL不受注射吗?
  3. 如果在客户端提供查询非常有用,为什么不让SQL版本不受注入?

7498
2017-08-30 01:39


起源



答案:


由于在松弛频道中回复它的用户没有回答这个问题,我会发布他们的答案。

  1. GraphQL查询针对明确构建的模式进行验证,以向客户端公开数据。 SQL不会针对除数据库架构结构之外的任何内容验证您的查询。
  2. 从理论上讲,您的GraphQL端点具有某种安全性,可以验证用户是否可以在查询的起始点查询数据。一旦它们位于基于图形的模式中,权限就是graphQL模式定义所固有的,并且注入不会完成任何事情。
  3. 制作一个不受注入的SQL版本将涉及GraphQL所做的一些相同的验证。某种验证允许所有请求的数据/突变。正如聊天中所引用的那样,“注入不是SQL固有的问题”。

答案归功于 查理 和 samwgoldman 来自GraphQL / #s general Slack聊天。


14
2017-08-31 11:20



我想补充一点,GraphQL查询变量消除了“注入”问题的可能性。如同 ”?”在SQLite中,GraphQL查询变量允许您在查询中语义地放置变量,GraphQL将在运行查询之前验证变量的提供值是否有效。 - Lee Byron
在这里找到关于GraphQL和安全/注入的好文章: mikewilliamson.wordpress.com/2016/09/15/graphql-and-security - joost


答案:


由于在松弛频道中回复它的用户没有回答这个问题,我会发布他们的答案。

  1. GraphQL查询针对明确构建的模式进行验证,以向客户端公开数据。 SQL不会针对除数据库架构结构之外的任何内容验证您的查询。
  2. 从理论上讲,您的GraphQL端点具有某种安全性,可以验证用户是否可以在查询的起始点查询数据。一旦它们位于基于图形的模式中,权限就是graphQL模式定义所固有的,并且注入不会完成任何事情。
  3. 制作一个不受注入的SQL版本将涉及GraphQL所做的一些相同的验证。某种验证允许所有请求的数据/突变。正如聊天中所引用的那样,“注入不是SQL固有的问题”。

答案归功于 查理 和 samwgoldman 来自GraphQL / #s general Slack聊天。


14
2017-08-31 11:20



我想补充一点,GraphQL查询变量消除了“注入”问题的可能性。如同 ”?”在SQLite中,GraphQL查询变量允许您在查询中语义地放置变量,GraphQL将在运行查询之前验证变量的提供值是否有效。 - Lee Byron
在这里找到关于GraphQL和安全/注入的好文章: mikewilliamson.wordpress.com/2016/09/15/graphql-and-security - joost