fix: safeReturn для всех редиректов (security)

- ui/routes/auth.js: safeReturn() для returnTo в POST /login и /login-token
- src/routes/oidc.js: safeLocal() для oidcReturnTo в /callback
This commit is contained in:
2026-06-04 15:26:26 +03:00
parent 6edef60ed8
commit 8cbbe52316
3 changed files with 79 additions and 3 deletions
+12 -1
View File
@@ -88,7 +88,7 @@ function createRouter({ auth, doubleCsrfProtection, generateCsrfToken, authLimit
};
}
const returnTo = req.session.oidcReturnTo || '/';
const returnTo = safeLocal(req.session.oidcReturnTo) || '/';
delete req.session.oidcReturnTo;
res.redirect(returnTo);
} catch (e) {
@@ -109,4 +109,15 @@ function createRouter({ auth, doubleCsrfProtection, generateCsrfToken, authLimit
return router;
}
/**
* Валидирует redirect-цель: разрешает только локальные пути.
* Защита от open redirect: //evil.com и https://evil.com → '/'.
*/
function safeLocal(target) {
if (typeof target === 'string' && target.startsWith('/') && !target.startsWith('//')) {
return target;
}
return '/';
}
module.exports = { createRouter };