使用GraphQL,你可以隨時精確查詢任何你想要的內容。對於API來說,這是令人驚奇的,但是也有複雜的安全隱患。惡意人員可能提交一個開銷大的嵌套的查詢,而不是請求合法的有用數據,來使你的服務器、數據庫、網絡或所有這些設施過載。沒有正確的保護措施,你就會面臨拒絕服務(Denial of Service,DoS)攻擊的風險。
例如,在我們Spectrum的GraphQL API中,我們有一個如下關係:
type Thread {
messages(first: Int, after: String): [Message]
}
type Message {
thread: Thread
}
type Query {
thread(id: ID!): Thread
}
如你所見,你既可以查詢一個線程的消息列表,也能查詢一個消息的線程。這種循環關係讓惡意人員可以構建一個如下的開銷大的嵌套循環:
query maliciousQuery {
thread(id: "some-id") {
messages(first: 99999) {
thread {
messages(first: 99999) {
thread {
messages(first: 99999) {
thread {
# ...repeat times 10000...
}
}
}
}
}
}
}
}
原文鏈接:【https://www.infoq.cn/article/6bE0YJMK6iofaRV47iVL】。未經作者許可,禁止轉載。