Quando os redirecionamentos são implementados no Node.js e/ou no Express, é importante executar a validação de entrada no lado do servidor. Se um atacante descobrir que você não está validando informações externas fornecidas pelo usuário, ele poderá explorar essa vulnerabilidade postando links especialmente criados em fóruns, mídias sociais e outros locais públicos para que os usuários cliquem nele.
Exemplo: redirecionamento inseguro no express usando a entrada do usuário
const express = require('express');
const app = express();
app.get('/login', (req, res, next) => {
if (req.session.isAuthenticated()) {
res.redirect(req.query.url);
}
});
A correção sugerida para evitar redirecionamentos inseguros é evitar confiar na entrada do usuário. Se a entrada do usuário precisar ser usada, as listas de permissões de redirecionamento seguras podem ser usadas para evitar a exposição da vulnerabilidade.
Exemplo: Lista de permissões de redirecionamento seguro
const whitelist = {
'https://google.com': 1
};
function getValidRedirect(url) {
// verifique se o URL começa com uma única barra
if (url.match(/^\/(?!\/)/)) {
// Prefira nosso domínio para ter certeza
return 'https://example.com' + url;
}
// Caso contrário, verifique com uma lista de permissões
return whitelist[url] ? url : '/';
}
app.get('/login', (req, res, next) => {
if (req.session.isAuthenticated()) {
res.redirect(getValidRedirect(req.query.url));
}
});
Do blog NodeSwat:
Felizmente, os métodos de atenuação para essa vulnerabilidade são bastante diretos. Não use a entrada do usuário não validada como base para o redirecionamento.
Do blog Hailstone
No entanto, se a lógica de redirecionamento do lado do servidor não validar os dados que entram no parâmetro url, seus usuários podem acabar em um site que se parece exatamente com o seu (examp1e.com), mas atende às necessidades de hackers criminosos!