Öffentliche GraphQL-Introspection: warum sie ein Problem ist und wie du sie abschaltest
GraphQL-Introspection ist die eingebaute Query, die das vollständige Schema deiner API zurückgibt: jeden Typ, jedes Feld, jedes Argument und jede Mutation. In der Entwicklung ist sie unverzichtbar, bei privaten APIs sollte sie in Produktion aber nicht erreichbar sein. Bleibt sie aktiv, ist sie eine Karte der gesamten Angriffsfläche deines Backends.
Was es ist
Jeder GraphQL-Server implementiert eine kleine Gruppe von Meta-Feldern, allen voran __schema und __type. Ein einziger POST an /graphql mit `query { __schema { types { name fields { name } } } }` liefert die vollständige Typdefinition.
Tools wie GraphiQL, Apollo Sandbox und die Playground-UI sind auf Introspection angewiesen, um Queries automatisch zu vervollständigen und den Schema-Explorer darzustellen. In der Entwicklung ist genau das gewollt; in Produktion bei einer privaten API bedeutet es, dass jeder auf der Welt dieselbe Karte herunterladen kann.
Warum es wichtig ist
Das Schema benennt deine Modelle, deine Beziehungen und jede Mutation, die du bereitstellst — einschließlich Admin-, interner und veralteter Felder, die nie von außen entdeckt werden sollten. Angreifer nutzen es, um eine gezielte Liste von Operationen zu erstellen, die sie auf Auth-Bypass-, IDOR- und Injection-Bugs abklopfen.
Selbst wenn jedes Feld korrekt autorisiert ist, sollten versteckte Mutations wie refundOrder, impersonateUser oder exportBackup nicht für sich werben. Introspection verwandelt die Aufklärungsphase eines Angreifers von stundenlangem Raten in einen einzigen Request.
So behebst du es
Schalte Introspection ab, wenn NODE_ENV production ist. Lass sie lokal aktiv, damit dein Team das Schema weiterhin in der Sandbox erkunden kann.
import { ApolloServer } from "@apollo/server";
const server = new ApolloServer({
typeDefs,
resolvers,
introspection: process.env.NODE_ENV !== "production",
});Yoga bietet ein eigenes Plugin; graphql-http stellt eine Validierungsregel aus graphql-js bereit. Beide stoppen Introspection-Queries, bevor sie ausgeführt werden.
// GraphQL Yoga
import { createYoga } from "graphql-yoga";
import { useDisableIntrospection } from "@graphql-yoga/plugin-disable-introspection";
export const yoga = createYoga({
schema,
plugins: process.env.NODE_ENV === "production" ? [useDisableIntrospection()] : [],
});
// graphql-http (or express-graphql)
import { NoSchemaIntrospectionCustomRule } from "graphql";
const validationRules = process.env.NODE_ENV === "production"
? [NoSchemaIntrospectionCustomRule]
: [];GraphiQL, Playground und Apollo Sandbox sollen Menschen helfen, das Schema zu erkunden — auf einem öffentlichen Produktions-Endpunkt haben sie nichts zu suchen. Schütze sie mit einer Auth-Prüfung oder binde sie im Produktions-Build gar nicht erst ein.
Introspection zu deaktivieren ist eine Härtungsmaßnahme, keine Zugriffskontrolle. Jedes Feld braucht weiterhin eine korrekte Autorisierung auf Resolver-Ebene — sonst kann jeder, der einen Feldnamen errät, es trotzdem aufrufen. Betrachte Introspection als eine Schutzschicht, nicht als die einzige.
FAQ
Ist das Verstecken des Schemas nicht einfach Security through Obscurity?
Teilweise, ja — ein entschlossener Angreifer kann Feldnamen immer noch per Brute Force erraten. Aber es lohnt sich, Aufklärung nicht billig und vollständig zu machen. Jeder Leitfaden für kommerzielle GraphQL-APIs und das OWASP GraphQL Cheat Sheet empfehlen, Introspection in Produktion zu deaktivieren.
Was ist mit einer öffentlichen API, bei der Entwickler das Schema erkunden sollen?
Stelle das Schema bewusst bereit — veröffentliche eine Schema-Definition-Language-Datei, hoste eine Doku-Website oder gib Introspection erst nach einer Authentifizierung frei. Das ist etwas ganz anderes als ein anonymer POST, der alles zurückliefert.
Wie erkennt AppSafe das?
AppSafe sendet per POST eine kleine Introspection-Query an /graphql und /api/graphql und sucht nach einer __schema-Antwort mit Status 200. Kommt sie zurück, wird das mit mittlerem Schweregrad in der Kategorie API-Sicherheit gemeldet.
Ist deine App betroffen?
AppSafe prüft dies und Dutzende weitere Probleme in einem kostenlosen Scan.
Meine App gratis scannenVerwandte Guides
CORS-Fehlkonfiguration: die Wildcard- und Reflection-Fallen
Erlaube jeden Origin und jede Website kann deine API lesen.
Ausführliche Fehlerseiten und Stack Traces in Produktion
Ein Stack Trace zeigt Angreifern genau, wohin sie zielen müssen.
Gefährliche HTTP-Methoden: wie TRACE, PUT und DELETE annonciert werden
Eine OPTIONS-Antwort mit TRACE oder DELETE verrät mehr als sie sollte.
API-Keys, die in clientseitigem JavaScript offengelegt sind
Alles in deinem Bundle ist öffentlich. Behandle es entsprechend.