使用curl调用BurpSuite GraphQL的GetScan接口意外失败如何排查
你当前请求的核心错误点
- 错误1:使用GET请求携带请求体不符合GraphQL通用规范。绝大多数GraphQL服务仅支持将查询参数放在URL中传递GET请求,会直接忽略GET请求的请求体,甚至直接触发服务端异常。GraphQL查询优先使用POST方法传递请求体。
- 错误2:你在查询中定义了必填变量
$id: ID!,但完全没有传递该变量的有效值。ID!的感叹号标识该变量为必填项,缺失会直接触发查询错误。 - 错误3:你整理的变量定义格式错误,且存在无用变量:变量定义不需要加
$前缀,你写的$agent: "Firefox"变量没有在查询逻辑中用到,多余变量也可能触发部分服务端的校验报错。 - 错误4:你curl命令中的JSON请求体仅包含
query字段,缺少用于传递变量的variables字段。
常见疑问解答
你不需要给查询里的id、status等字段传值,这些是你指定服务端需要返回的字段,只要和服务端Schema定义一致即可。你当前的JSON结构已经包含了要求的query字段,这部分是符合规范的。
修正后的请求示例
GraphQL查询(移除无用的agent变量)
query GetScan ($id: ID!) { scan(id: $id) { id status agent { id name } site_application_logins { login_credentials { label username } recorded_logins { label } } audit_items { id issue_counts { total } number_of_requests } scan_configurations { id name } } }
对应curl命令
注意替换<MY_API_KEY>、<实际要查询的扫描ID>、你的服务地址:
curl -k -i -H "Content-Type: application/json" -H "Authorization: <MY_API_KEY>" -X POST -d '{ "query": "query GetScan ($id: ID!) { scan(id: $id) { id status agent { id name } site_application_logins { login_credentials { label username } recorded_logins { label } } audit_items { id issue_counts { total } number_of_requests } scan_configurations { id name } } }", "variables": { "id": "<实际要查询的扫描ID>" } }' 'https://mybsee.example.com/graphql/v1'
通用GraphQL查询构造方法
后续对接其他GraphQL接口可以按照这个流程操作:
- 请求方式优先选POST,请求体为标准JSON格式,必须包含
query字段存放GraphQL查询语句,可选variables字段存放变量键值对、operationName字段指定要执行的查询名(多个查询定义时需要)。 - 变量使用规则:查询开头定义的变量(格式为
$变量名: 类型),必须在variables字段中传入对应类型的值,变量名不需要加$前缀;标记为!的非空变量必须传值,查询中没有用到的变量不要传入。 - 调试优先用可视化工具:所有GraphQL服务基本都配套GraphiQL/Playground可视化调试界面,直接在界面里写查询、填变量,调试通后再导出为curl命令,可以避免绝大多数格式、拼写、字段错误。
- 报错排查优先级:先检查变量是否完整、类型是否匹配,再检查查询的字段名、参数名是否和Schema一致,最后检查请求格式是否符合要求。
内容的提问来源于stack exchange,提问作者hotmeatballsoup
相关产品推荐
相关产品推荐

