【发布时间】:2020-01-18 09:36:32
【问题描述】:
我正在运行 AWS AppSync GraphQL API 服务,尽管根据我所知道的,这个问题同样适用于 apollo-server。
根据我对 GraphQL 解析器及其链接方式的理解,恶意授权客户端似乎可以针对他们有权访问的对象发出经过身份验证的请求,然后在正文中将请求链接在一起,以便最终访问它们不属于的记录授权给。 有哪些有效的设计模式可以防止此类攻击?
例如,我将使用一个不是我实际的情况,但应该足够简单以理解我的意思。假设我们正在运行一个学生成绩数据库。
有称为学生、成绩和课程的类型。
为方便起见,当您查找学生时,其中有一个解析器可返回成绩。同样为方便起见,当您查找成绩时,它所在的课程有一个解析器。另外,为方便起见,当您查找课程时,您可以看到已注册的学生。
现在,作为一名学生,我完全有理由这样称呼:
query {
getMyRecord {
name
studentId
ssn
grades {
gradeValue
semester
course {
name
courseId
courseNumber
}
}
}
}
这将是一个非常正常的电话。此外,GraphQL API 也支持课程管理员和教授的方法,因此他们完全有权调用类似的方法:
query {
getCourse {
name
courseId
courseNumber
students {
studentId
name
}
}
}
同样,我们的 GraphQL API 支持非常合理。
问题是恶意学生可能会检查架构并决定将上面的第一个查询扩展为:
query {
getMyRecord {
name
studentId
ssn
grades {
gradeValue
semester
course {
name
courseId
courseNumber
students { #note here!
name
ssn
grades {
gradeValue
#... and so on!
}
}
}
}
}
}
这将导致恶意开始查看其他学生的成绩和 ssn、他们正在学习的课程、学生在 THOSE 课程中注册的内容等等。
我可以想到一些设计模式来防止这种情况,但它们似乎都不优雅。特别是,我可以在链式解析器的每一步都重新运行授权器,但这会导致工作量大幅增加,99% 的调用会出现大量重复工作。
我非常期待学习已建立的设计模式以防止此类攻击。
【问题讨论】:
标签: amazon-web-services security graphql aws-appsync