Как составить уникальное имя для $_SESSION в PHP?

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

if($login_failed) {

            // update failed login attempts
            $session_name = 'failed_attempts'.$_SERVER['REMOTE_ADDR'];

            if(!isset($_SESSION[$session_name])) {
                $_SESSION[$session_name] = 1;               
            }
            else {
                $_SESSION[$session_name] += 1;  
            }

}

Как видите, чтобы определить уникальное имя для каждой сессии, я добавляю IP-адрес пользователя в конец строки «failed_login_attempts».

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

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

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

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


person Community    schedule 02.05.2012    source источник


Ответы (3)


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

идентификатор сеанса — это то, что связывает все это вместе.

Что на самом деле происходит за кулисами, так это то, что PHP хранит cookie в браузере с уникальным идентификатором (идентификатором сеанса), который связан со структурой данных, хранящейся на сервере. Никакие фактические данные сеанса никогда не покидают сервер, кроме этого идентификатора. На самом деле это файл, вы можете увидеть его, если покопаетесь в своих папках php.

person dmp    schedule 02.05.2012
comment
правильно, но что мне поставить вместо вопросительных знаков, чтобы увидеть, было ли предпринято хотя бы 5 неудачных попыток --------› if(isset($_SESSION[???]) && $_SESSION[? ??] == '5') - person ; 02.05.2012
comment
Другими словами, как мне связать неудачный сеанс с пользователем, поскольку пользователь еще не вошел в систему. - person ; 02.05.2012
comment
сохраните количество попыток в переменной, и если оно больше 5, выполните свою логику. это действительно так просто. однако, поскольку он основан на файлах cookie, вы можете сохранить какое-то предупреждение в базе данных для этого пользователя. - person dmp; 02.05.2012
comment
как указывает Майкл ниже, если пользователь очистит свои файлы cookie, он может предпринять еще одну попытку, поэтому я упоминаю о сохранении предупреждения где-то. - person dmp; 02.05.2012
comment
Однако сохранение неудачных попыток в базе данных вызовет ту же проблему. Потому что даже тогда мне нужно связать неудачные попытки с конкретным пользователем. Вот почему я пытался использовать IP в имени сеанса. По-прежнему нужен способ однозначно связать неудачные попытки с конкретным пользователем. - person ; 02.05.2012
comment
в этом случае вам нужно повысить сложность и посмотреть на сохранение данных, связанных с этой попыткой входа в систему. Строка агента пользователя, IP, имя пользователя, количество попыток. Вы также можете сделать хэш этих значений, чтобы упростить хранение. - person dmp; 02.05.2012
comment
похоже, вы уже на правильном пути - просто подумайте, и вы доберетесь туда :) - person dmp; 02.05.2012

В большинстве школьных, домашних и офисных сетей ваши пользователи будут использовать общие IP-адреса, поскольку они будут получать доступ к более широкому Интернету через NAT или через исходящий брандмауэр. Используйте uniqid(), чтобы сгенерировать уникальное значение для каждого сбоя. Это не совсем необходимо, поскольку session_id() содержит уникальное значение. уже для каждого сеанса пользователя.

Все, что вам действительно нужно сделать, чтобы отслеживать сбои в сеансе, — это увеличить переменную внутри этого сеанса.

if (failed_login) {
  $_SESSION['failed_logins']++;
}

$threshold = 5;
if ($_SESSION['failed_logins'] >= $threshold) {
   // Do whatever is needed when too many failures occur
}

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

person Michael Berkowski    schedule 02.05.2012

Лучшим решением было бы пометить/увеличить столбец в вашей пользовательской таблице и, когда он достигает 5, активировать код капчи. После успешного входа сбросьте значение на 0.

person Scott    schedule 01.09.2015
comment
Я не согласен. Это кажется ценным советом, и вопрос на самом деле не позволяет использовать много кода в ответах. Я хотел бы получить некоторые подробности о том, как активировать код капчи из триггера базы данных... - person Félix Adriyel Gagnon-Grenier; 02.09.2015