security(auth): anti-enumeration, returnTo-валидация, лимит попыток логина
Шаг 2.1 плана production-готовности: - единый 401 при любом отказе логина + constant-time bcrypt - forgot-password: идентичный ответ независимо от существования email - sanitizeReturnTo (open redirect fix в /api/documents/generate-link) - 10 неудачных попыток → блок 15 мин (in-memory, аудит) - DATABASE_SSL_REJECT_UNAUTHORIZED env (дефолт true) - доделка 0.7: статичные тексты в llm-providers/rag/finance-di2 - 8 новых тестов (104/104)
This commit is contained in:
11
server/utils/return-to.ts
Normal file
11
server/utils/return-to.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
// Валидация returnTo/redirect-параметров против open redirect:
|
||||
// принимаем только относительные пути, начинающиеся с одиночного '/'.
|
||||
// '//evil.com' (protocol-relative), '/\evil.com' (backslash-trick,
|
||||
// браузеры трактуют '\' как '/') и управляющие символы отклоняются.
|
||||
export function sanitizeReturnTo(value: unknown): string | undefined {
|
||||
if (typeof value !== 'string' || value.length === 0) return undefined;
|
||||
if (!value.startsWith('/')) return undefined;
|
||||
if (value.length > 1 && (value[1] === '/' || value[1] === '\\')) return undefined;
|
||||
if (/[\r\n\0]/.test(value)) return undefined;
|
||||
return value;
|
||||
}
|
||||
Reference in New Issue
Block a user