Missing Webhook Verification
Webhook routes without signature verification
criticalSecurity
missing-webhook-verificationWhy this matters
Without signature verification, anyone can send fake webhook events to your endpoint. They can trigger payments, create accounts, or corrupt your data by forging events.
✗ Bad
export async function POST(req: Request) {
const event = await req.json();
if (event.type === "payment_intent.succeeded") {
await fulfillOrder(event.data.object);
}
return new Response("ok");
}✓ Good
import Stripe from "stripe";
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);
export async function POST(req: Request) {
const body = await req.text();
const sig = req.headers.get("stripe-signature")!;
const event = stripe.webhooks.constructEvent(
body, sig, process.env.STRIPE_WEBHOOK_SECRET!
);
if (event.type === "payment_intent.succeeded") {
await fulfillOrder(event.data.object);
}
return new Response("ok");
}How to fix
Verify the webhook signature using the provider's SDK (Stripe, GitHub, etc.) before processing any event. Reject requests with invalid or missing signatures.