Односторонняя аутентификация между сайтами (PHP / Apache) - PullRequest
3 голосов
/ 01 февраля 2011

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

Мое единственное требование безопасности заключается в том, чтобы пользователи, заходящие на мой справочный сайт, могли войти, только если они щелкнули ссылку «Справка» в основном приложении. (Очевидно, что компания не хочет, чтобы они снова вводили свои учетные данные.) Мне не нужно обмениваться информацией между сайтами взад-вперед.

Я смотрел на $ _SERVER ['HTTP_REFERER'] (небезопасно), Oauth и OpenID (которые кажутся излишними). Мне интересно, лежит ли ответ в односторонней аутентификации SSL (основное приложение имеет сертификат), но я немного теряюсь здесь.

Таким образом, вопрос заключается в следующем: как проще всего это сделать и как это будет выглядеть с точки зрения Apache и PHP?

Большое спасибо за любые советы!

Ответы [ 2 ]

1 голос
/ 01 февраля 2011

Ссылка на помощь может содержать строку токена. Когда пользователь щелкает ссылку, справочная система видит этот токен и выполняет вызов веб-службы для вашего приложения, спрашивая, действителен ли этот токен. Если токен действителен, то веб-служба отвечает утвердительно, и сайт справки позволяет пользователю войти в систему. Токен может быть действительным, только если этот пользователь выполнил вход. Кроме того, вы можете закодировать IP-адрес клиента в URL-адрес и убедитесь, что лицо, пытающееся войти в справочную систему, имеет тот же IP-адрес. Так вот так:

  1. У вас есть ссылка для помощи с токеном: http: //help.yoursite.com/?token= <уникальный идентификатор> & client = md5 ()
  2. Пользователь переходит по этой ссылке, и он переходит на help.yoursite.com.
  3. help.yoursite.com проверяет, что md5 () соответствует клиентскому параметру URL. Если так, то это вероятно тот же человек, а не подделка.
  4. help.yoursite.com затем вызывает веб-службу yoursite.com и спрашивает, действителен ли уникальный идентификатор этого ip клиента.
  5. yoursite.com проверяет, является ли он действительным, и возвращает да или нет, и, возможно, имя пользователя, вошедшего в систему, чтобы на help.yoursite.com было имя пользователя, вошедшего в систему.
  6. help.yoursite.com принимает ответ и впускает пользователя или нет.

Таким образом, вы убедились, что клиент такой же, и что они вошли на другой сайт. Ваше общение между вашим сайтом и сайтом help.yours должно быть безопасным. Это намного проще, чем oauth, и даже немного похож на аналогичный протокол, НО это не так безопасно в целом. Есть еще способы обойти это, но все зависит от того, какой риск вы готовы принять.

0 голосов
/ 01 февраля 2011

Зависит от того, насколько независимы эти два сайта. Если они совместно используют доступ к чему-то частному (базе данных или некоторому файловому пространству), то вы можете рассмотреть возможность передачи случайного значения между ними. В противном случае, если вы можете использовать подход время + соль, который позволяет только тем, кто использует ту же соль / алгоритм, генерировать действительные URL.

M = Основной сайт
H = Справочный сайт
K = Значение ключа, передаваемое между ними (в виде обычного текста, в порядке)

A: серверное время + соль:

XMIT : M время хэширования (округлено до -сказать- ближайший десятиминутный маркер) + некоторое случайное значение (соль), чтобы сделать K . И добавляет K к URL справки (еще лучше, если запрос справки - POST, поэтому K не виден пользователю).

RCV : H завершает тот же хэш, используя тот же алгоритм, и если его хэш совпадает с предоставленным K , тогда доступ предоставляется. В противном случае H показывает пустую страницу (возможно, в целях безопасности они предпочли бы, чтобы детали сайта держались в секрете?) Или сообщение об ошибке (больше риска, но полезно для законных пользователей).

REQ : Оба сайта на одном сервере ИЛИ оба сайта на серверах, которые разумно синхронизированы во времени - нет необходимости в совершенной синхронизации из-за 10-минутного квантования. Важно, чтобы значение соли было одинаковым на обоих серверах и не было общедоступным (его также можно обновить, если когда-нибудь возникнет опасность, что третья сторона выяснит это).

БЕЗОПАСНОСТЬ : соль никогда не передается в виде обычного текста между двумя серверами, но поскольку передаваемый ключ работает только в течение определенного периода времени, даже если кто-то прослушивает значение (или копирует его из источника из * 1046) * M ) получить доступ можно только временно. Вам необходимо округлить до ближайшего n минутного маркера, чтобы (а) дать разумное время посетителю страницы для запроса помощи (б), поскольку запрос и проверка будут занимать небольшое количество времени друг от друга и (в) потому что, если сайты находятся на разных серверах, время не будет одинаковым. Безопасность достигается за счет сохранения конфиденциальности и алгоритма вычисления времени.

ПРИМЕЧАНИЕ : При H вам может потребоваться проверить два значения K , чтобы учесть случаи острых изгибов, когда скругление ведет M и H в разное время (из-за разного времени или из-за задержки в обработке)

B: База данных / ключ файла:

XMIT : M генерирует случайное значение для K и сохраняет его и время истечения в таблице или файле базы данных, которые H может получить доступ. Снова M присоединяет K (без тайм-аута) к GET или POST к H .

RCV : H проверяет значение по списку сохраненных значений, и если оно найдено и не истекло, доступ предоставляется.

REQ : Оба сайта имеют доступ к общему хранилищу файлов или базе данных. Таблица или файл базы данных должны хранить несколько случайных значений. M или H должны очистить записи с истекшим сроком (либо как часть их кода операции, либо может быть настроена запланированная задача [cron job] для выполнения этого через регулярные промежутки времени)

БЕЗОПАСНОСТЬ : Хотя K находится в виде обычного текста, знать его не имеет смысла - опять же, перехват значения или копирование его из источника откуда-то только предоставит доступ В временно.

В целом

В зависимости от того, насколько вы терпимы к тайм-аутам пользователя или неавторизованным источникам, использующим «найденные» клавиши, вы можете использовать AJAX для генерации значения при нажатии кнопки справки и поддерживать очень низкий тайм-аут (17 секунд?)

...