Когда перенаправления реализованы в Node.js и/или Express, важно выполнить проверку входных данных на стороне сервера. Если злоумышленник обнаружит, что вы не проверяете внешние вводимые пользователем данные, он может воспользоваться этой уязвимостью, разместив специально созданные ссылки на форумах, в социальных сетях и других общедоступных местах, чтобы пользователи могли щелкнуть по ним.
Пример: небезопасное экспресс-перенаправление с использованием пользовательского ввода
const express = require('express');
const app = express();
app.get('/login', (req, res, next) => {
if (req.session.isAuthenticated()) {
res.redirect(req.query.url);
}
});
Предлагаемое исправление: чтобы избежать небезопасных перенаправлений, состоит в том, чтобы не полагаться на пользовательский ввод. Если необходимо использовать пользовательский ввод, можно использовать белые списки безопасного перенаправления, чтобы избежать уязвимости.
Пример: белый список безопасного перенаправления
const whitelist = {
'https://google.com': 1
};
function getValidRedirect(url) {
// check if the url starts with a single slash
if (url.match(/^\/(?!\/)/)) {
// Prepend our domain to make sure
return 'https://example.com' + url;
}
// Otherwise check against a whitelist
return whitelist[url] ? url : '/';
}
app.get('/login', (req, res, next) => {
if (req.session.isAuthenticated()) {
res.redirect(getValidRedirect(req.query.url));
}
});
Из блога NodeSwat:
К счастью, методы смягчения этой уязвимости довольно просты - не используйте неподтвержденный пользовательский ввод в качестве основы для перенаправления.
Из блога Hailstone
Однако, если логика перенаправления на стороне сервера не проверяет данные, введенные в параметре url, ваши пользователи могут оказаться на сайте, который выглядит точно так же, как ваш (examp1e.com), но в конечном итоге удовлетворяет потребности преступных хакеров!