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

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

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

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


person spirytus    schedule 06.07.2010    source источник
comment
Добавлены теги PHP и MySQL.   -  person mcandre    schedule 06.07.2010
comment
IP-адрес не является хорошим решением — несколько компьютеров могут находиться за маршрутизатором, поэтому все они будут иметь один и тот же IP-адрес при доступе к вашему сайту.   -  person OMG Ponies    schedule 06.07.2010
comment
Почему вы хотите встроить это ограничение? Я использую несколько компьютеров для посещения нескольких сайтов, я бы очень обиделся, если бы вы не разрешили мне посещать ваш сайт и с других компьютеров. Возможно, связано: Создание веб-приложения PHP, позволяющего пользователям голосовать за отправленные материалы. Как свести к минимуму злоупотребления?   -  person Marcel Korpel    schedule 06.07.2010
comment
@Marcel Korpel: я помню, как мне приходилось иметь дело с пользователями, редактирующими одну и ту же страницу, но из двух разных окон браузера...   -  person OMG Ponies    schedule 06.07.2010


Ответы (6)


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

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

person Curtis    schedule 06.07.2010
comment
+1: Единственный способ узнать это - проверить, вошел ли пользователь уже в систему. - person OMG Ponies; 06.07.2010
comment
я хочу сделать нечто подобное, ваш 2-й пункт мне не понятен, расскажите мне подробнее, пожалуйста. - person Mohd Shahid; 03.05.2013

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

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

person nathan    schedule 06.07.2010
comment
Тем не менее, вы можете экспортировать сертификат и скопировать его на свой домашний компьютер. - person grundprinzip; 04.06.2011

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

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

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

person GalacticCowboy    schedule 06.07.2010
comment
Это может быть внутреннее приложение. Если это система, работающая в одном домене. IP-адреса будут более предсказуемыми, но все же не уникальными (в зависимости от аренды, которую получают IP-адреса). - person Brendan Bullen; 07.07.2010

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

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

ОБНОВЛЕНИЕ

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

person SoftwareGeek    schedule 06.07.2010
comment
MAC-адреса НЕ отправляются на сервер браузером - person Sripathi Krishnan; 07.07.2010
comment
Также не гарантируется, что они будут уникальными. Я видел некоторые старые коробки SUN, которые позволяли вам устанавливать MAC-адрес с помощью DIP-переключателя. - person Curtis; 07.07.2010
comment
Хорошо, вы можете использовать ActiveX для IE или разработать плагин для других браузеров, таких как firefox/safari/chrome, который может считывать MAC-адреса. - person SoftwareGeek; 08.07.2010

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

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

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

person Richard Knop    schedule 07.07.2010

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

person mcandre    schedule 06.07.2010
comment
Да на кой черт ты это делаешь...?? - person Zak; 07.07.2010
comment
Я думаю, что иногда, даже если вы не согласны с тем, о чем они просят, вы должны предположить, что на это есть причины. В этом случае указано, что это запрос Клиента (через редактирование). Вопрос не в том, должны ли они это делать, а в том, как они могут это сделать. Кроме того, это интересно для размышлений. В некоторых отношениях это противоречит самой концепции веб-приложений (бросая вызов распределенной природе, ограничивая отдельных пользователей отдельными машинами), но, по крайней мере, это может быть интересной задачей. - person Brendan Bullen; 07.07.2010
comment
Если клиент спросит, как лучше прыгать с моста, стоит ли публиковать с помощью ваших ног? - person mcandre; 07.07.2010
comment
Есть разница между обсуждением с Клиентом и разработчиком, просто передающим пожелания Клиента. Если Клиент одержим желанием сделать что-то безумное и платит за это разработчику, почему бы ему не протянуть руку и не спросить Как? - person Brendan Bullen; 08.07.2010
comment
Задавать вопросы здесь — часть моего исследования, поэтому я могу объяснить клиенту все возможные последствия. Как я уже сказал, я согласен с его ужасной идеей, но не делайте этого, вряд ли это поможет моему делу. Также не вижу причин, по которым клиент когда-либо спрашивал меня, как лучше спрыгнуть с моста. - person spirytus; 12.07.2010
comment
Ха-ха! Нет, конечно, не стали бы, если бы понимали, что ограничение доступа к одной машине похоже на прыжок с моста. - person mcandre; 12.07.2010
comment
-1 Возможно, владелец бизнеса не хочет, чтобы многие люди заходили на сайт с нескольких компьютеров. Я хочу, чтобы все пользователи моей административной системы имели к ней доступ из любого места, но только при использовании своего рабочего ноутбука (на котором, как я знаю, не установлено никаких вредоносных программ). - person Dan Blows; 15.12.2012
comment
На этой платформе мы не следуем бизнес-правилам. мы пытаемся найти лучшее решение для решения проблемы. - person Majid Qafouri; 18.01.2021