Как да съставя уникално име за $_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 неуспешни опита, изисквам да се попълва captcha при всеки следващ опит.

Просто се притеснявам, че може да има някои мрежи, в които на много потребители е присвоен един и същ IP адрес, в който случай, ако 1 потребител не успее да влезе, всички ще започнат да виждат captcha, въпреки че само на този 1 потребител трябва да се покаже captcha.

Това разумно ли е или никога няма ситуация, в която 2 потребители могат да имат един и същ IP, например те могат да имат едни и същи първи 3 октета, но последното число ще бъде различно, в който случай не трябва да се притеснявам.

Ако има вероятност множество потребители да споделят един и същ IP, тогава какъв е добър начин да се определи уникален идентификатор за името на моята сесия, който ще свърже невлязъл потребител със сесията?


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


Отговори (3)


Сесията вече е уникална, тъй като е свързана с бисквитка за този конкретен потребител в този конкретен браузър. Не е нужно да се притеснявате, че ще се разпространи към други потребители.

ID на сесията е това, което свързва всичко това.

Това, което всъщност се случва зад кулисите, е, че PHP съхранява бисквитка в браузъра с уникален идентификатор (идентификатор на сесията), който е свързан със структура от данни, съхранявана на сървъра. Нито една от действителните данни за сесията никога не напуска сървъра, освен този идентификатор. Това всъщност е файл, можете да го видите, ако бръкнете във вашите 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, направете вашата логика. наистина е толкова просто. тъй като обаче е базиран на бисквитки, може да искате да съхраните някакъв вид предупреждение в db за този потребител. - person dmp; 02.05.2012
comment
както Майкъл посочва по-долу, ако потребителят изчисти бисквитките си, може да направи нов опит, поради което споменавам съхраняването на предупреждение някъде. - 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, да задействате кода captcha. След като влезете успешно, нулирайте стойността на 0.

person Scott    schedule 01.09.2015
comment
Не съм съгласен. Това изглежда като ценен съвет и въпросът всъщност не позволява много код в отговорите. Все пак бих искал някои подробности за това как да задействам captcha код от задействане на база данни... - person Félix Adriyel Gagnon-Grenier; 02.09.2015