Несмотря на то, что всё нижеописанное по большому счёту применимо к вебу в целом, я буду рассказывать обо всём с точки зрения PHP-программиста, чтобы было понятнее.
Как можно с точки зрения стандартных средств веба однозначно определить пользователя?
Давайте начнём с того, что однозначное определение человека как индивида возможно только с помощью логина/пароля, которые знает только он и использует их для входа в систему. И то это не 100% гарантия, поскольку авторизационная информация может быть украдена и использована злоумышленником.
Но с этим всё ясно. Давайте рассмотрим случай, когда регистрация/вход не предусматривается. Например, если мы хотим, чтобы пользователи голосовали за какое-нибудь фото и не могли накручивать голоса, или кликали на баннеры и не накручивали клики и т.д.
Если проанализировать всю информацию, которая может быть передана от клиентской стороны на сервер и использована для идентификации пользователей, то можно выделить следующие вещи:
- Cookies — «куки» (массив $_COOKIE в PHP) — это небольшие куски информации, которые хранятся в браузере на стороне пользователя и передаются в каждом запросе. Куки доступны из Javascript (исключение составляют куки, имеющие свойство HttpOnly). Кука привязана к учётной записи пользователя в конкретном браузере на конкретном компьютере и будет храниться всё время, пока не будет изменена/удалена или не истечёт срок её действия.
- IP-адрес (переменная $_SERVER[‘REMOTE_ADDR’]) — это физический адрес клиентского компьютера в сети интернет. Бывает статическим и динамическим. В отличие от куки, IP-адрес не привязан к учётной записи пользователя или к браузеру, а только к конкретному компьютеру. Но он также не может являться однозначным идентификатором компьютера, так как может быть изменён в любой момент. В частности, если провайдер клиента не предоставляет статического адреса, то адрес меняется при каждом подключении к интернету, а также может автоматически меняться раз в несколько дней.
- Юзер-агент ($_SERVER[‘HTTP_USER_AGENT’]) — строка текста, которая передаётся в заголовках запросов и идентифицирует тип используемого браузера. Вряд ли может быть использована для идентификации пользователя, поскольку будет изменяться при обновлении версии браузера и при использовании пользователем другого браузера.
Теперь приведу список вещей, которые НЕ передаются с клиента на сервер.
- MAC-адрес — это число, которое однозначно идентифицирует сетевую карту или модем, используемую для выхода в интернет. Проблема в том, что этот адрес не передаётся через концентраторы и маршрутизаторы. Поэтому может быть использован только в локальной сети, но, увы, не в интернете.
- Сессия (в PHP это массив $_SESSION) — вопреки уверенному (но ошибочному) мнению начинающих программистов на PHP, этот массив ни в каком виде не передаётся ни на клиентскую сторону, ни с клиентской стороны, и тем более не может быть там сохранён. Сессия — принадлежность сервера, а точнее, некоторый кусок информации, хранящейся на сервере, идентифицируемый числом — номером сессии (session_id), который на самом деле как правило хранится в куке.
Как Вы видите, в вебе просто не существует адекватного надёжного способа идентификации пользователя или компьютера. Поэтому в случаях, когда регистрация пользователя невозможна или не желательна по логике приложения, для исключения возможности накрутки, а точнее, максимального её усложнения, используют различные хитрости и комбинированные методы.