Skip to content

Commit b1a0c73

Browse files
fix(server): return 403 for CSRF errors instead of 500
Add CSRF error detection to error handler so CSRF validation failures return proper 403 Forbidden status instead of generic 500. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent e393e6b commit b1a0c73

2 files changed

Lines changed: 10 additions & 4 deletions

File tree

graphql/server/src/middleware/error-handler.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ interface ErrorResponse {
3232
logLevel: 'warn' | 'error';
3333
}
3434

35+
const isCsrfError = (err: Error): boolean => {
36+
const code = (err as unknown as { code?: string }).code;
37+
return typeof code === 'string' && code.startsWith('CSRF_');
38+
};
39+
3540
const categorizeError = (err: Error): ErrorResponse => {
3641
if (isApiError(err)) {
3742
return {
@@ -41,6 +46,10 @@ const categorizeError = (err: Error): ErrorResponse => {
4146
logLevel: err.statusCode >= 500 ? 'error' : 'warn',
4247
};
4348
}
49+
if (isCsrfError(err)) {
50+
const code = (err as unknown as { code: string }).code;
51+
return { statusCode: 403, code, message: err.message, logLevel: 'warn' };
52+
}
4453
if (err.message?.includes('ECONNREFUSED') || err.message?.includes('connection terminated')) {
4554
return { statusCode: 503, code: 'SERVICE_UNAVAILABLE', message: sanitizeMessage(err), logLevel: 'error' };
4655
}

graphql/server/src/plugins/auth-cookie-plugin.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -203,10 +203,7 @@ export const AuthCookiePlugin: GraphileConfig.Plugin = {
203203
grafserv: {
204204
middleware: {
205205
processRequest: {
206-
callback: async (
207-
next: MiddlewareNext<Result | null>,
208-
event: Parameters<GraphileConfig.GrafservMiddleware['processRequest']>[0]
209-
): Promise<Result | null> => {
206+
callback: async (next, event) => {
210207
const result = await next();
211208

212209
// Only process buffer results (JSON responses)

0 commit comments

Comments
 (0)