diff --git a/src/lib/auth.ts b/src/lib/auth.ts index d9888b5..8b26abf 100644 --- a/src/lib/auth.ts +++ b/src/lib/auth.ts @@ -54,6 +54,10 @@ export const auth = betterAuth({ // массовый сброс паролей + общие IP (офис/NAT). 10/мин/IP — защита // от брутфорса сохраняется, но терпимо к повторам и опечаткам. "/sign-in/email": { window: 60, max: 10 }, + // Эндпоинты, отправляющие письма на произвольный адрес: глобальный + // лимит 100/мин позволял абузить почтовую репутацию домена. + "/send-verification-email": { window: 60, max: 3 }, + "/forget-password": { window: 60, max: 3 }, }, }, trustedOrigins: [ diff --git a/src/middleware.ts b/src/middleware.ts index d172ab7..57166d3 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -6,6 +6,13 @@ const PUBLIC_ROUTES = ["/login", "/register", "/verify-email", "/forgot-password export function middleware(request: NextRequest) { const { pathname } = request.nextUrl; + // Прямой Better Auth sign-up обходит Turnstile/honeypot-обёртку + // (/api/register) — наружу закрыт. Сама регистрация не страдает: + // /api/register вызывает auth.handler программно, минуя middleware. + if (pathname.startsWith("/api/auth/sign-up")) { + return new NextResponse(null, { status: 404 }); + } + if ( PUBLIC_ROUTES.some((route) => pathname.startsWith(route)) || pathname.startsWith("/_next") ||