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
17.12.2003, 22:11:06
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
17.12.2003, 22:14:53
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...
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
17.12.2003, 22:38:44
Przepraszam, rzeczywiście nie spojrzałem na kod, który podałeś. Pozdrawiam.
Bora
17.12.2003, 23:34:26
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]
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
18.12.2003, 23:36:46
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
noid
19.12.2003, 07:27:16
ale tesh sie da wyciagnac wew IP tylko ze serwer proxy musi miec wlaczne take ciuś i kod odpowiedni trzeba miec
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
19.12.2003, 09:37:29
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

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
19.12.2003, 09:56:05
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...
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
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.