2015-10-08 2 views
0

Пользователи с веб-сайта (внешнего сайта) должны быть перенаправлены на мой сайт. Вместе с перенаправлением будут переданы данные о пользователе, которые не должны отправляться с использованием строки запроса.Перенаправление пользователей и данных безопасным способом

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


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

на основе this excellent article.

Маркер затем следует использовать для передачи данных с внешнего сайта на мой API/MVC сайта. Однако я застрял в том, как я могу продолжить, так как я не думаю, что веб-сервер может передавать токен аутентификации при одновременном перенаправлении.

Как я могу сопоставить перенаправление и данные, в то же время я уверен, что внешний сайт является надежным партнером?

ответ

0

Я бы использовал подход OAuth. Оба сервера имеют общий секрет (GUID или что-то еще). При визуализации формы сервер A генерирует случайный токен «nonce». Он также получает временную метку (для OAuth это количество секунд с 1/1/1970). Строка объединяет nonce, timestamp и общий секрет, а затем помещает их (используя SHA или что-то еще). Это хешированное значение называется сигнатурой. Затем включают в себя следующие, как скрытые входные параметры:

  • одноразовый номер
  • метка времени
  • подпись

Когда сервер B принимает ответ он делает несколько вещей:

  • Убедитесь в том, timestamp находится в пределах X минут часов сервера B.
  • Убедитесь, что nonce не используется (я расскажу об этом через секунду).
  • Объединить временную метку, ноту и копию сервера B общего секретного ключа . Хешируйте их, используя тот же алгоритм.
  • Проведите сравнение строк на $ POST ['signature'] с только что сгенерированной подписью. Если соответствуют, то вы знаете, что запрос поступал с сервера A.

Nonces не являются универсальными, они уникальны только для определенного периода времени. Чтобы отслеживать их, вы должны хранить словарь в глобальной области. Ключ - это nonce, а значение - метка времени, когда он использовался. Когда приходит запрос, найдите в словаре словарь nonce. Если связанная с ним временная метка находится в пределах +/- X минут часов сервера B, то отклоните запрос. Если он находится за пределами вашего диапазона, или он еще не находится в словаре, разрешите запрос и добавьте в словарь слова «nonce» и «timestamp».

Цель состоит в том, чтобы предотвратить повторные атаки. Бот не может обнюхать трафик, захватить явно видимое значение nonce, timestamp и подпись и снова отправить его на сервер B с другой полезной нагрузкой.

Замечание о диапазоне временных интервалов (X выше), в OAuth оно служит одной цели: обеспечить буфер между различиями в серверных часах. В этом отношении он обычно короткий - несколько минут. В вашем случае сервер A генерирует nonce при начальной загрузке страницы, поэтому диапазон timestamp должен включать время, когда пользователь должен заполнить форму. Я предлагаю, чтобы временные метки не могли опережать текущее время сервера более чем на несколько минут, но они могут быть за серверным временем на 30-60 минут. Недостатком является то, что ваш словарь без слова должен удерживать значения дольше.

+0

Привет, спасибо за очень хороший ответ. :) Что делать, если я должен был добавить третий сервер в качестве сервера аутентификации, можно ли это сделать, используя подход oauth? – TheTango

+0

Мне нужна дополнительная информация о том, чего вы хотите достичь. Будет ли этот сервер аутентифицировать пользователя перед входом в сервер A? Будет ли это центральный сервер, используемый как сервером A, так и сервером B? – Chet

Смежные вопросы