0%

GraphQL API学习总结

[TOC]

GraphQL语言学习

下面所有GraphQL文档都可以在在线graphiql网站上面运行测试。

核心概念

GraphQL的三种操作:查询(query)、变更(mutation)、订阅(subscription)

这是一个带有查询操作的GraphQL文档示例:

query{
users{
id
name
}
}

字段

一个GraphQL字段描述一条独立信息。该信息可简单可复杂,含有数据之间的关系。在上述文档,操作中包含的全部内容,即users、id和name都是字段

参数

将字段想象成可以返回值的函数,他们也可以接收行为不同的参数,如:

users(limit:5,order_by: {id:asc})

该示例中,users字段接收参数limit,以限制返回的结果的数量,order_by参数用来将返回的结果进行排序,{id:asc}表示以id字段进行升序排序。

变量

query ($limit: Int) {
users(limit: $limit) {
id
}
}

该变量在操作的顶部定义,且该变量的值可由客户端以服务器理解的格式发送。 通常变量以JSON表示,如下所示:

{
limit:5
}

操作名称

当文档中含有多个操作时,服务器必须了解执行哪些操作并以相同的顺序将结果映射回来。 例如:

query fetchUser {
...
}
query fetchUsers {
...
}

片段

片段可以提高GraphQL的重用性。 如果文档中的某些部分在给定的类型上重用相同的字段集,那么片段就大有帮助。如:

fragment userFields on users{
id
name
}
query{
users{
...userFields
}
}

此处对片段的使用...userFields,这种用法叫作片段扩展。 还有内联片段,即没有分别明确声明片段却在查询中内联使用了它。

指示

GraphQL规范支持的一些默认服务器指示包括:

  • @deprecated(reason: String) - 将字段标为已弃用
  • @skip(if: Boolean) - 跳过该字段的 GraphQL 执行
  • @include(if: Boolean) - 如果为 true,则为带注解的字段调用解析器。
query ($showName: Boolean!){
users{
id
name @include(if: $showName)
}
}

内省查询

简单来说就是,GraphQL内置了接口文档,你可以通过内省的方法获得这些信息,如对象定义、接口参数等信息。
GraphQL服务器公开以下有关Query操作类型的内省查询:

  • __schema
  • __type
  • __typename

当使用者不知道某个GraphQL接口中的类型哪些是可用的,可以通过__schema字段来向GraphQL查询哪些类型是可用的。如:

{
__schema{
types{
name
}
}
}
image-20250207182426398

CTF例题

[NewStarCTF 公开赛赛道]ezAPI

payload:

id=1&data={"query":"{\n  __schema{\n    types{\n      name\n    }\n  }\n}\n\n","variables":null}

{"query":"query{\nffffllllaaagggg_1n_h3r3_flag(id:1) {\nflag\n}\n}\n", "variables":null}

参考文章:

通过 GraphQL 查询抓取数据 | GraphQL 教程

玩转graphQL

GraphQL API漏洞笔记 | 某不知名博客