Предотвращение атак «человек посередине» с помощью аутентификации пользователя (Node / Vue / Passport) - PullRequest
0 голосов
/ 26 января 2019

У меня сейчас есть веб-приложение, которое я пишу в 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), чтобы сделать себя любым пользователем, которого они хотят.Они могут войти в систему как обычно, используя собственную учетную запись, открыть вкладку «Сеть» и скопировать полезную нагрузку ответа, а затем изменить пользовательские данные по своему усмотрению.Я полагаю, что при проверке статуса входа пользователя в систему должен быть какой-то тип шифрования между внешним интерфейсом и бэкэндом.

Я пытался подумать о том, как можно предотвратить это, но все, что с моей стороны (по крайней мере, на стороне сервера) кажется бесполезным, поскольку любой запрос может быть легко перенаправлен на локальную машину злоумышленника.

Есть ли какой-нибудь совет о том, как "подписать" мои запросы, чтобы убедиться, что они не проксируются?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 26 января 2019

После прочтения ваших файлов github:

server.get("/admin", function(req, res){
    if(req.user && req.user.roles.includes("administrator")){
        //user is an administrator, render the admin panel view
    }else{
        //is not an admin, redirect or send error message
    }
});

На каждом маршруте Express после аутентификации с помощью Passport у вас есть объект req.user.

Он устанавливается путем проверки файла cookie запросаconnect.sid и проверка, к какому сеансу относится этот файл cookie на сервере.Таким образом, вы можете доверять тому, что на любом маршруте Express объект req.user содержит информацию, относящуюся к этому cookie, и вы можете воздействовать на него.

Небольшое примечание : делать сервер-проверка стороны должна со временем стать для вас рефлексом.

Клиент предназначен для отображения информации.Если в какой-то момент вы заставляете клиента принять какое-либо решение, которое может быть связано с обеспечением безопасности, сделайте шаг назад и подумайте еще раз.

0 голосов
/ 26 января 2019

Вам не нужно подписывать тело ответа на запрос API. Типичный способ проверки подлинности состоит в создании подписанного файла cookie сеанса, который действует либо как идентификатор для информации сеанса во внешней базе данных, либо содержит саму информацию сеанса. Этот файл cookie должен находиться в заголовке вашего ответа, а паспорт должен дать вам возможность управлять этим файлом cookie, даже если вы этого даже не осознали.

Таким образом, пользователь не может подделать информацию, отправленную с сервера, способом, который легко обнаружить, и, поскольку это файл cookie, он будет автоматически отправляться с каждым запросом вашим браузером (хотя, если вы используете некоторые В библиотеке AJAX вам, возможно, придется явно указать, что вы хотите отправить куки). В комментарии, на которые ссылается MadEard, можно получить доступ к информации о файлах cookie, используя passprt, который является свойством «user» в объекте «req».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...