PHP / Javascript: отличить два компьютера от одной сети - PullRequest
3 голосов
/ 23 октября 2010

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

  • Кроссплатформенный (может использоваться на клиентах Windows / Mac / Linux).
  • Независимо от браузера.

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

Какие-нибудь советы?

Ответы [ 7 ]

4 голосов
/ 23 октября 2010

Вы можете попробовать использовать постоянный Cookie-файл, например "Evercookie" http://samy.pl/evercookie/,, чтобы каждый компьютер идентифицировал свой файл cookie, и он будет постоянным.

Тогда все, что вам нужно сделать, это связать этот файл cookie со своей схемой обработки сеанса.

Редактировать: Как отметил Клаудиу, вам также необходимо убедиться, что у пользователя включен JS, изапретить доступ в случае, если он отключен.

У всех методологий, использующих IP-адрес для проверки, есть 2 проблемы: - Любой может использовать прокси-сервер и обходить его - Он не будет работать в среде NAT *

2 голосов
/ 23 октября 2010

Редактировать: я считаю свой ответ взломанным и хотел бы увидеть альтернативную методику.

Как бы я ни ненавидел их, проверка на Flash Cookies будет работать здесь.Большинство пользователей не знают, что они даже на компьютере, поэтому вам не нужно сильно беспокоиться об их удалении.Перейдите по этой ссылке и посмотрите, сколько человек сидят на вашем компьютере целую вечность без вашего ведома: Flash Cookie Manager .

Я не думаю, что Flash работает с iPhone, но вы не упомянули об этом.

Вот Adobe берет флэш установить базу . Википедия также учитывает проникновение вспышки.

1 голос
/ 20 октября 2011

Идентификатор сеанса должен достаточно легко их различать.

Попробуйте это:

<?php
$a = session_id();
if(empty($a)) session_start();
echo "SID: ".SID."<br>session_id(): ".session_id()."<br>COOKIE: ".$_COOKIE["PHPSESSID"];
?>

Три способа показать ваш идентификатор. Session_id () является наиболее надежным. Я заметил, что Firefox не получает SID, Internet Explorer не получает PHPSESSID. Оба делают отчет session_id.

1 голос
/ 23 октября 2010

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

Существует де-факто стандартсреди прокси добавить HTTP-заголовок «X-Forwarded-For», который отражает внутренний IP-адрес клиента.Пара $ _SERVER ['REMOTE_ADDR'] плюс значение X-Forwarded-For в принципе дает вам уникальную идентификацию компьютера клиента.Однако X-Forwarded-For может быть легко подделан опытным злоумышленником, который использует реальный IP-адрес.

Чтобы получить значение X-Forwarded-For в php:

$headers = apache_request_headers(); 
$full_client_id = $_SERVER['REMOTE_ADDR'] . '|' . $headers["X-Forwarded-For"];

$ full_client_id, который может выглядеть, например, как '123.1.2.3 | 192.168.1.1', даст вам почти надежную идентификацию, которая будет сохранена в данных вашего сеанса и сравнена с каждым вновь созданным сеансом.

Это защитит васпо крайней мере, против очень очевидного злоупотребления неопытными пользователями.

0 голосов
/ 23 октября 2010

Вы можете просто добавить битовый столбец (IsLoggedIn) в вашу базу данных, указывающий, вошел ли человек в данный момент или нет?

Вещи, которые не будут работать и почему:

  1. IP: все, кто находится в локальной сети за маршрутизатором, будут видеть на вашем сайте одинаковый IP-адрес.

  2. Cookies: они зависят от браузера.Файл cookie в IE, например, не будет известен в Firefox.

0 голосов
/ 23 октября 2010

Есть несколько факторов, на которые нужно обратить внимание.

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

Что бы я сделал, это

Храните зарегистрированных пользователей в таблице и отслеживайте их последние действия. Если ваш сайт является сайтом, на котором пользователь может не менять страницу в течение некоторого времени, вам следует настроить Javascript, который просто пингует ваш сервер из браузера, чтобы PHP всегда в курсе.

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

Вы также должны отслеживать IP-адреса, которые пользователь использует для входа в систему, чтобы иметь увеличенную таблицу, такую ​​как

user_id         ip                hits
--------------------------------------
1             xxx.yyy.zzz.244     6
1             xxx.yyy.zzz.224     4
1             xxx.yyy.zzz.264     1
1             xxx.yyy.zzz.124     1
1             xxx.yyy.zzz.174     1
2             aaa.bbb.zzz.678     3
.....

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

0 голосов
/ 23 октября 2010

Единственный способ, которым я вижу, это проверить по IP, если у вас уже подключен $ _SERVER ['REMOTE_ADDR'], а затем не пускать другой.Конечно, в некоторых случаях вы можете иметь один и тот же IP-адрес на двух разных ПК, но это наиболее безопасный способ, поэтому ваши пользователи должны знать об этом.

...