Sessie te sloom voor page refresh?
Ik heb een php applicatie gemaakt, maar wil deze uiteraard ook beveiligen.
Mijn beveiliging bestaat uit:
- Ten eerste een IP Check. Als je op een bepaald ip adres zit is inloggen niet nodig.
- Als je niet op dit IP adres zit, wordt je dooorverwezen naar login.php
- Als je correct inlogt, wordt je sessie gestart en wordt je doorverwezen naar index.php
Mijn probleem: Als je dus buiten het onbeveiligde IP adres zit, en wil inloggen, kom je prima op de login pagina, maar, als je klikt op inloggen, is de session start blijkbaar te sloom voor de page refresh?
Is het echt zo dat een session aanmaken zo sloom is of zit er een fout in mijn pagina?
En hoe kan ik dit eventueel oplossen?
Groetjes Feiko
P.S. Hieronder bijgevoegd gedeeltelijk de code van iptest.php en login.php.
login.php:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<? if ($naaminputc==$naamdbc) {
mysqli_query($con,"INSERT INTO Logins (naam, login_id, ip, date, correct) VALUES ('$naaminputc', '$code', '$clientip', '$datum', 'ja')");
$_SESSION['luser'] = $naaminputc;
$_SESSION['start'] = time();
$_SESSION['expire'] = $_SESSION['start'] + (30 * 60);
header('Location: http://xxxxxx.nl/index.php');
} ?>
mysqli_query($con,"INSERT INTO Logins (naam, login_id, ip, date, correct) VALUES ('$naaminputc', '$code', '$clientip', '$datum', 'ja')");
$_SESSION['luser'] = $naaminputc;
$_SESSION['start'] = time();
$_SESSION['expire'] = $_SESSION['start'] + (30 * 60);
header('Location: http://xxxxxx.nl/index.php');
} ?>
iptest.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<? $clientip = $_SERVER['REMOTE_ADDR'];
if($clientip !='xx.xx.x.xxx'){
$now = time();
session_start();
if (!isset($_SESSION['luser'])) {
header('Location: http://www.xxxxxxx/login.php');
}
elseif ($now > $_SESSION['expire']){
session_destroy();
header('Location: http://www.xxxxxx/login.php');
}
else {}
} ?>
if($clientip !='xx.xx.x.xxx'){
$now = time();
session_start();
if (!isset($_SESSION['luser'])) {
header('Location: http://www.xxxxxxx/login.php');
}
elseif ($now > $_SESSION['expire']){
session_destroy();
header('Location: http://www.xxxxxx/login.php');
}
else {}
} ?>
Toevoeging op 16/06/2015 16:11:35:
Comment: Ik heb het ook geprobeerd met de HTML Refresh (<META HTTP-EQUIV="refresh" CONTENT="5; URL=http://www.xxxxxx.nl/index.php">)
En bij 5 seconden werkte het op de pc, maar op een smartphone nog niet. Verder is dit een ontzettend irritante manier, omdat je bij een login lang moet wachten, en gebruikers dan geirriteerd raken en het nog een keer proberen etc.
Dus als iemand een andere oplossing heeft, zou fantastisch zijn.
Gelieve in het vervolg bij code de [code][/code]-tags gebruiken.
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt![/modedit]
Gewijzigd op 16/06/2015 17:02:39 door Feiko Ritsema
>> is de session start blijkbaar te sloom voor de page refresh?
Waarom denk je dat? Wat gebeurt er dan?
Ozzie PHP op 16/06/2015 16:15:19:
Even algemeen ... gebruik eens duidelijke namen: "naaminputc", "naamdbc", "code", "luser". Nederlands en Engels door elkaar en veel te vaag.
>> is de session start blijkbaar te sloom voor de page refresh?
Waarom denk je dat? Wat gebeurt er dan?
>> is de session start blijkbaar te sloom voor de page refresh?
Waarom denk je dat? Wat gebeurt er dan?
Mee eens, het is allemaal niet super netjes, maar is voor de werking verder niet van belang.
Als iemand correct inlogt wordt hij doorverwezen naar index.php, waar de iptest.php wordt ge'include. Dan vervolgens wordt de gebruiker gelijk weer doorverwezen naar login.php..
Daarom lijkt het alsof de sessie te sloom is voor de refresh, of zit ik hier fout mee?
Dat is redelijk nonsens ;) Als je het doet, doe het dan gelijk goed. Als je deze code over 2 maanden terugleest dan heb je geen flauw idee meer hoe die in elkaar steekt. Goede code leest als een boek, jouw code leest als een puzzel.
Je hele code deugt (met alle respect) niet heel veel van.
Zit in login.php wel een session_start()? Die mis ik namelijk.
Session_start() hoort op regel 1 te staan.
Het punt is namelijk dat je alleen de 1e keer terug wordt verwezen naar login.php , als je vervolgens handmatig naar de index.php pagina gaat wordt je niet terug verwezen, dus zijn de sessions wel goed ingesteld.
Daarom dacht ik dat de eerste keer misschien te snel wordt doorverwezen, of mijn server simpelweg te sloom is?
Waar is je session_start() in login.php?
Toevoeging op 16/06/2015 17:57:39:
Ik heb er nu een vertraging van 5 seconden in zitten, en hij werkt wel.
Maar toch vind ik dit maar een tijdelijke oplossing omdat het gewoon niet ideaal is wat mij betreft.
Beschouw de volgende code:
Code (php)
Omdat je geen exit; na je header('Location: ...') zet gebeurt er het volgende:
- de "AFGESCHERMDE" CODE wordt gewoon uitgevoerd
- je wordt na afloop geredirect
Sessies zijn normaal niet traag. Gebruik je (heavens forbid) framesets? Strooi anders eens wat session_write_close()s in je code en kijk of dat wat uitmaakt.
En anders zou ik je eigen code eens serieus onder de loep nemen, want dit klinkt niet echt normaal.
Maaaar.. ik wilde eigenlijk zeggen met jouw beveiliging van IP.. is een beetje achterhaalt.
Tegenwoordig zit je in de trein met je mobieltje en je kan wel tig keer van IP veranderen, plus thuis 3g en wifi pakt je telefoon automatisch de "beste" verbinding. Dus als je dit doet, zorg wel dat je je sessie en je beveiliging niet zoveel laat beïnvloeden door een IP.
Johan K op 16/06/2015 22:49:17:
Thomas heeft zeker gelijk;
Maaaar.. ik wilde eigenlijk zeggen met jouw beveiliging van IP.. is een beetje achterhaalt.
Tegenwoordig zit je in de trein met je mobieltje en je kan wel tig keer van IP veranderen, plus thuis 3g en wifi pakt je telefoon automatisch de "beste" verbinding. Dus als je dit doet, zorg wel dat je je sessie en je beveiliging niet zoveel laat beïnvloeden door een IP.
Maaaar.. ik wilde eigenlijk zeggen met jouw beveiliging van IP.. is een beetje achterhaalt.
Tegenwoordig zit je in de trein met je mobieltje en je kan wel tig keer van IP veranderen, plus thuis 3g en wifi pakt je telefoon automatisch de "beste" verbinding. Dus als je dit doet, zorg wel dat je je sessie en je beveiliging niet zoveel laat beïnvloeden door een IP.
Wat dacht je van school, bedrijfs of open netwerken.
Als er 1 persoon inlogt, is het hele netwerk ingelogd op dat account.
@Thomas: Uiteraard gebruik ik geen framesets, maar bedankt voor de tip, slordig dat ik dit over het hoofd heb gezien. Het lijkt nu beter te werken, maar heb er alsnog een vertraging van 1 seconde op zitten omdat een directe redirect nog 'te snel' is blijkbaar.. In ieder geval bedankt, werkt al een stuk soepeler.
Feiko Ritsema op 16/06/2015 16:19:05:
Als iemand correct inlogt wordt hij doorverwezen naar index.php, waar de iptest.php wordt ge'include. Dan vervolgens wordt de gebruiker gelijk weer doorverwezen naar login.php..
Er zit een logicafout in je redenatie en daardoor in de flow van je applicatie. Als iemand correct inlogt, is die hele IP-test overbodig: je hebt dat vaste IP-adres immers opgenomen om nu juist te voorkomen dat vanaf dat IP-adres moet worden ingelogd.
Ik denk dat je de hele structuur moet omwerken. Zet om te beginnen eens alles in één bestand, zodat je logica kunt uitbouwen in één overzichtelijk if/elseif/else.