Как ограничить доступ к веб-приложению только одной машиной? - PullRequest
3 голосов
/ 06 июля 2010

Мне нужно убедиться, что каждый пользователь, имеющий доступ к моему веб-приложению, может сделать это только с одного компьютера, поэтому 100 пользователей означают 100 компьютеров. Какое будет лучшее решение? Является ли обнаружение и сохранение IP-адреса при первом входе в систему хорошей идеей? Я думаю, что IP может измениться даже во время сеанса, верно? Я также думал о том, чтобы сохранить cookie, когда пользователь впервые входит в систему. Затем назначил эти cookie пользователю, так же, как я уже делал это с паролем и именем пользователя, и каждый раз, когда обращался к приложению, проверяя наличие этого cookie.

Пожалуйста, дайте мне знать, что, по вашему мнению, будет лучшим решением. Мой бэкэнд - php / mysql, если это имеет значение.

РЕДАКТИРОВАТЬ: мне нужно уточнить ... Это в дополнение к обычному управлению сессиями. Мне нужно ограничить пользователей, чтобы иметь возможность входить в веб-приложение только с одной конкретной машины. Таким образом, если пользователь первоначально вошел в систему со своего компьютера на работе, и я сохранил его ip / cookie / и т. Д., То клиент выйдет из системы (или даже не выйдет), уйдет домой и попытается войти, но не сможет этого сделать. Я согласен с этой ужасной идеей, но клиент настаивает:)

Ответы [ 6 ]

6 голосов
/ 06 июля 2010

IP-адрес может измениться в случае мобильных клиентов или клиентов, которые переключаются между проводными и беспроводными сетями.Лучше всего будет предоставить случайно сгенерированный UID каждому клиенту при первом подключении (если у него еще нет cookie).Затем вы можете проверить, что одно и то же имя пользователя не подключается, используя два разных UID.

Хитрость заключается в том, что вам нужно убедиться, что этот UID отключен от времени, чтобы при переходе пользователя на другой компьютер он не был заблокирован.Возможно, одно изменение UID в порядке, но они не могут вернуться к UID, который уже использовался?

2 голосов
/ 07 июля 2010

Вы можете ограничиться одним useragent, выдав клиенту SSL-сертификат на стороне клиента, созданный с помощью элемента keygen, браузер сгенерирует пару ключей, сохраняя закрытый ключ в пользовательском агенте, после чего вы получите SPKAC. , который вы можете использовать, чтобы openssl создал сертификат, который вы затем отправляете обратно агенту пользователя, он устанавливает его и с его помощью можно идентифицировать пользователя в этом конкретном браузере только через HTTP + TLS.

Все остальное, просто не будет работать на 100% - хотя вы можете взломать способы, которые кажутся работающими (пока что-то пойдет не так, и это не сработает):)

0 голосов
/ 07 июля 2010

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

Можно также подумать об использовании некоторой информации из $ _SERVER, чтобы ограничить пользователей сочетанием одного веб-браузера (HTTP_USER_AGENT) и одного порта (REMOTE_PORT) - в качестве дополнительного способа дифференциации машин.

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

0 голосов
/ 06 июля 2010

К сожалению, IP не зависит от компьютера по нескольким причинам:

  1. IP-адрес может измениться во время сеанса без уведомления (пользователь может даже не знать об этом)
  2. У большинства пользователей динамический IP, поэтому он определенно изменится в какой-то момент
  3. Для таких машин, как ноутбук, планшет или мобильный телефон, IP-адрес зависит от текущего поставщика услуг
  4. Все пользователи за прокси могут показаться вам как один IP-адрес, поэтому вы все равно не сможете определить, перешли ли они с одного компьютера на другой

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

0 голосов
/ 06 июля 2010

Лучшее решение уже встроено в веб-сервер, в зависимости от того, какой сервер вы используете.Вот для чего нужны сеансы .В ASP.NET/IIS обычно время ожидания сеанса составляет 20 минут.

Таким образом, если пользователь использует другой компьютер для доступа к вашему веб-приложению, то время ожидания сеанса освободит соединение с незанятого компьютера.

UPDATE

Возможно, вы захотите ограничить пользователя по MAC-адресу их машин, которые являются уникальными.

0 голосов
/ 06 июля 2010

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

...