У меня сейчас есть веб-приложение, которое я пишу в Node / Vuejs с проверкой подлинности Passport, и я столкнулся с проблемой.Я думал о том, как настроить аутентификацию в настоящий момент, и понял, что у меня есть явная дыра в безопасности.
Короче говоря, у меня в хранилище Vuex есть локальная конечная точка API /api/me
.Эта конечная точка просто возвращает req.user
.Для краткости типичный ответ выглядит следующим образом:
{
username: 'Bob',
roles: [] // normal user has no roles,
email: 'someguy@bob.com'
}
Мой маршрут администратора /admin
имеет проверку beforeEnter, как показано ниже, которая включает эту проверку с использованием хранилища Vuex, поэтому я могуКэшированная версия пользовательских данных, доступных на внешнем интерфейсе.
{
path: '/admin',
name: '/admin',
component: Admin,
beforeEnter: (to, from, next) => {
store.dispatch('getMe').then(() => {
if (store.getters.user.roles && store.getters.user.roles.includes('administrator')) {
next();
return;
}
next({ path: '/' });
});
}
}
Но вот в чем дело - я понял, что кто-то может легко сыграть в систему.На самом деле, я попробовал сам с тестовой учетной записью, отличной от Adminstrator, и смог войти, вернув с локального сервера, настроенного для этой цели в Postman, следующее:
{
username: 'Super Admin Joe',
roles: ['administrator'] // normal user has no roles,
email: 'admin@bob.com'
}
И альт!Теперь у пользователя есть полный доступ к страницам администратора.
Мой вопрос: как я могу предотвратить это?
Мне нужно проверить, что пользователь проходит проверку подлинности на каждой странице, но потенциальный злоумышленникможет довольно легко прокси любого запроса (в данном случае это /api/me
), чтобы сделать себя любым пользователем, которого они хотят.Они могут войти в систему как обычно, используя собственную учетную запись, открыть вкладку «Сеть» и скопировать полезную нагрузку ответа, а затем изменить пользовательские данные по своему усмотрению.Я полагаю, что при проверке статуса входа пользователя в систему должен быть какой-то тип шифрования между внешним интерфейсом и бэкэндом.
Я пытался подумать о том, как можно предотвратить это, но все, что с моей стороны (по крайней мере, на стороне сервера) кажется бесполезным, поскольку любой запрос может быть легко перенаправлен на локальную машину злоумышленника.
Есть ли какой-нибудь совет о том, как "подписать" мои запросы, чтобы убедиться, что они не проксируются?Заранее спасибо!