Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sesje - zabezpieczenie przed ponownym wyk. PHPSESSID
Forum PHP.pl > Forum > PHP
dob
Witam mam pytanie w jaki sposób zabezpieczyc sie przed ponownym wykorzystaniem sesji tj. chciałbym uniknąc tego że ktoś zalogowany może dać 2 osobie link zawierający np. PHPSESSID=bcb3efb7b95ca5c2028d7b1174156ffe, wtedy ta 2 osoba klikając na link też bedzie zalogowana tylko ze ze wszystkimi danymi osoby pierwszej . Napisałem sobie taki kod :
[php:1:8cd3904143]<?php
if(!empty($_SESSION['ip'])){
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip= $_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$ip=$_SERVER['REMOTE_ADDR'];
}
if($_SESSION['ip']<>$ip){
header("location: ?mode=logout");
exit;
}
}else{
$_SESSION['ip']=$_SERVER['REMOTE_ADDR'];
}
if(!empty($_SESSION['user_agent'])){
if($_SESSION['user_agent']!=md5($_SERVER['HTTP_USER_AGENT'])){
header("location: ?mode=logout");
exit;
}
}else{
$_SESSION['user_agent']=md5($_SERVER['HTTP_USER_AGENT']);
}
?>[/php:1:8cd3904143]

No i mam jeszcze jakis niedosyt, mam wrazenie że takie zabezpieczenie jednak nie wystarczy.
tahat
Można zawsze pobierać IP osoby wchodzącej na stronę i sprawdzać czy się zgadza z IP osoby, która rozpoczęła sesję, ale to zawsze zajmuje trochę czasu przy wywołaniu strony i jeżeli bardzo zależy na szybkości, to lepiej skorzystać z innej metody.
scanner
Ile czasu zajmuje:
[php:1:9447bae8ed]<?php
if ($_SESSION['CLIENT_IP'] != $_SERVER['REMOTE_ADDR'])
?>[/php:1:9447bae8ed]Pół godziny? Jesli tak, to ja idę szukac innej metody...
dob
POzatym kolega chyba nie zwrócił uwagi na kod który wrzuciłem bo tam własnie jest porównymwane ip wchodzącego na strone z ip zapisanym w sesji (podobnie dla przeglądarki) . Mimo wszystko dzięki tahat za próbe pomocy :wink:
tahat
Przepraszam, rzeczywiście nie spojrzałem na kod, który podałeś. Pozdrawiam.
Bora
a jakby skorzystać z własnego mechanizmu sesji :


[php:1:bd6f1e42d7]<?php
function _read($key) {
$qry = "SELECT value FROM session WHERE sesskey = '$key' AND expiry > " . time()." AND ip='$_SERVER[REMOTE_ADDR]';
$qid = mysql_query($qry);
if (list($value) = mysql_fetch_row($qid)) {
return $value;
}

return false;
}

?>[/php:1:bd6f1e42d7]
dob
No niby mozna taki numer zrobic zeby zapisywac w bazie dodatkowo czas wygasniecia... ale równie dobrze można to zrobic w sesji np.

[php:1:b2bbbeabb3]<?php
$_SESSION['expire']=time()+3600*12;
?>[/php:1:b2bbbeabb3]

No i sprawdzac tak jak poprzednie :

[php:1:b2bbbeabb3]<?php
if(!empty($_SESSION['expire']){
if(time()>$_SESSION['expire'])){
header("location: ?mode=logout");
exit;
}
}else{
$_SESSION['expire']=time()+3600*12;
}
?>[/php:1:b2bbbeabb3]

Może jeszcze jakies pomysły ? :wink:
Kinool
wtrace swoje 5 groszy

jesli chodzi o porownywanie z IP to moze byc maly szczegol, w momencie maskowania lub jak kto woli translacji adresu w przypadku gdy ktos udostepnia net ma jeden publiczny IP a np 10 ludzi ma prywatne (w lanie) ale na zewnatrz sa widoczni jako ten jeden

wiec moral z tego taki ze czasami pod jednym IP moze byc kilku ludkow smile.gif
noid
ale tesh sie da wyciagnac wew IP tylko ze serwer proxy musi miec wlaczne take ciuś i kod odpowiedni trzeba miec
dob
Noid dobra rada ale zobacz w kod (3 i 4 linijka)


Cytat
wiec moral z tego taki ze czasami pod jednym IP moze byc kilku ludkow


Dokładnie ja mam taki problem bo pod jednym ip jet około 160 ludków, tak wiec chce sie zabezpieczyc. Ale poza IP, przeglądarką i limitem czasu nic mi juz nie przychodzi do głowy.

Może toś jeszcze ma jakes pomysły ?
Kinool
co do 3 i 4 linijki

nie zawsze udaje sie wyciagnac wewnetrzy adres, to czasmi zalezy od ustawien proxy pozatym takie cudo jak mozilla jest w stanie oszukac (niekiedy) XForward jest tam taki trik jak wstawienie adresu IP jaki ma byc wysylany do proxy.

no wlasnie smile.gif wydaje mi sie (a jestem tego pewien) ze xforward dziala na proxy a nie na NAT w pakiecie IP wyslanym z servera ktory sluzy do translacji adresow w zaden sposob niema zapisanego IP docelowego (wewnatrz sieci) te informacje sa na serverze dokonujacym transalcji, posiada on tablice wg ktorej potem rozsyla informacje do poszczegolnych klientow w sieci.

wiec NAT-owania raczej tym nie przejdziesz
mozesz sie pokusic o zbieranie roznych informacji o danym kompie np uzyty sytem czy przegladarka i porownywac to potem (ale podobna konfiguracja bedzie dawala takie same informacje), uzycie wszystkich tych informacji czyli IP rodzaj przegladarki i systemu znacznie zaweza mozliwosc oszukania. jak przyjdzie mi cos do glowy to napisze
jono
Możesz zrobić też tak, że do każdego linka dołączasz jakiś unikalny klucz i zapisujesz go do sesji. I teraz przy każdym zalogowaniu zmienia się klucz i na początku kodu sprawdzasz klucz. Jak wejdzie ktoś z innego kompa, to tylko jedna osoba będzie mogła zachować połączenie (ten który pierwszy przeładuje stronę, bo wtedy drugi zostanie ze starym, nieważnym kluczem...)

[php:1:b362dec778]<?php
if($_GET['key'] == $_SESSION['key']){
//Ładujesz stronę...

$klucz = substr(md5(uniqid(rand(), true)), 5, 5);
$_SESSION['key'] = $klucz;
echo '<a href=nastepny.php?key='.$klucz.'>';
}

?>[/php:1:b362dec778]

To zabezpieczy przed jednoczesnym dostępem przez dwie osoby... Musieli by wymieniać linki przy każdym przeładowaniu...
dob
Cytat
[...]wiec NAT-owania raczej tym nie przejdziesz
mozesz sie pokusic o zbieranie roznych informacji o danym kompie np uzyty sytem czy przegladarka[...]


Dokładnie to robie - ja jestem własnie za natem i nie działa X_FOR... dlatego porównuje własnie inne dane które pochodzą od uzytkowników...

Jono dzięki za pomysł - przemyśle go sobei dokładnie jutro bo dziś mi cos nmie idzie myślenie smile.gif

Pozdrawiam
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.