inloggen lukt pas na 2e keer gegevens invoeren
Ik heb een loginpagina, waarbij ik bij de juiste inloggegevens de benodigde data in een $_SESSION opsla. Dit gaat allemaal goed, de sessiewaarden worden opgeslagen.
Dit heb ik gechecked door ze te echoën.
Vervolgens stuur ik de bezoeker door naar de beveiligde pagina:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
ini_set('display_errors',1); // 1 == on , 0 == off
error_reporting(E_ALL | E_STRICT);
session_start();
if(!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] == false){
header('Location: http://www.domein.nl/login');
exit();
}
?>
ini_set('display_errors',1); // 1 == on , 0 == off
error_reporting(E_ALL | E_STRICT);
session_start();
if(!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] == false){
header('Location: http://www.domein.nl/login');
exit();
}
?>
(Dit is de basis van de controle, verder komt er nog een expire toets enzo, maar dat is nu even niet relevant.)
Als ik de inloggegevens de eerste keer invoer, krijg ik in de echo (direct na de header('') op de inlogpagina wel de sessiewaarden terug, maar ik wordt toch doorgestuurd naar de inlogpagina. Voer ik daar opnieuw de inloggegevens in, dan kan ik wel inloggen.
Wat gaat hier fout?
Quote:
Als ik de inloggegevens de eerste keer invoer, krijg ik in de echo (direct na de header('') op de inlogpagina wel de sessiewaarden terug, maar ik wordt toch doorgestuurd naar de inlogpagina.
Dan zal er daar iets fout zitten? Mogelijk voer je dingen in de verkeerde volgorde uit?
Laat anders daar eens code van zien, uit het bovenstaande kan ik niet veel afleiden en is er ook eigenlijk weinig fout, behalve dat als er ergens fouten worden geproduceerd, dit tot output kan leiden voordat je headers verzonden zijn wat vervolgens kan resulteren in de "headers already sent" foutmelding...
Overigens volstaat empty($_SESSION['logged_in']) in plaats van !isset($_SESSION['logged_in']) || $_SESSION['logged_in'] == false - dit is equivalent.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<?php
session_start();
ini_set('display_errors',1); // 1 == on , 0 == off
error_reporting(E_ALL | E_STRICT);
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
//Hier de check op de input
if (count($errors) == 0) {
try {
require_once ('../connect.php');
$sql_select = "SELECT id, username, password, auth, period, registerdate FROM members WHERE username = :username";
$userStmt = $db->prepare($sql_select);
$userStmt->execute(array(
':username' => $_POST['username']
));
sleep(2);
$results = $userStmt->fetchAll();
//Check the results from the database
if (count($results) == 1) {
foreach ($results as $result) {
$hash = $result['password'];
if (!password_verify(($_POST['password']), $hash)) {
header ('Refresh:1;url=../login');
echo 'Dit password is niet correct.';
exit();
}
if ($result['auth'] == 1) {
if ($result['period'] == 0) {
$timestamp = time();
$now = date('Y-m-d H:i:s', $timestamp);
if ($result['registerdate'] < $now) {
header ('Refresh: 1; url=../registreer');
echo 'Je registratieperiode is verlopen. Als je wilt kun je een nieuwe authorisatie aanvragen.';
exit();
}
}
//If authentication TRUE and period true, set session values
$_SESSION['logged_in'] = TRUE;
$_SESSION['id'] = $result['id'];
$_SESSION['registerdate'] = $result['registerdate'];
//Set session login-time and make it expire after being 60 minutes inactive
$_SESSION['start'] = time();
$_SESSION['expire'] = $_SESSION['start'] + (120 * 60);
header("Location: http://www.domein.nl");
//echo 'succesvol ingelogd. '.$_SESSION['logged_in']; (Hier krijg ik dus wel de boolean TRUE terug)
exit();
}
else {
header ('Refresh:1;url=../registreer');
echo 'Username niet bekend.';
exit();
}
}
}
//If the result from the database is not 1, go back to the login.php
else {
header ('Refresh:1;url=../login');
echo 'Onjuiste username en/of password ingevuld.';
exit();
}
}
catch(PDOException $e) {
header ('Refresh:1;url=../login');
echo 'Er is een fout opgetreden. Probeer het later nog eens.';
exit();
}
}
else {
header ('Refresh:0;url=../login');
exit();
}
}
?>
session_start();
ini_set('display_errors',1); // 1 == on , 0 == off
error_reporting(E_ALL | E_STRICT);
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
//Hier de check op de input
if (count($errors) == 0) {
try {
require_once ('../connect.php');
$sql_select = "SELECT id, username, password, auth, period, registerdate FROM members WHERE username = :username";
$userStmt = $db->prepare($sql_select);
$userStmt->execute(array(
':username' => $_POST['username']
));
sleep(2);
$results = $userStmt->fetchAll();
//Check the results from the database
if (count($results) == 1) {
foreach ($results as $result) {
$hash = $result['password'];
if (!password_verify(($_POST['password']), $hash)) {
header ('Refresh:1;url=../login');
echo 'Dit password is niet correct.';
exit();
}
if ($result['auth'] == 1) {
if ($result['period'] == 0) {
$timestamp = time();
$now = date('Y-m-d H:i:s', $timestamp);
if ($result['registerdate'] < $now) {
header ('Refresh: 1; url=../registreer');
echo 'Je registratieperiode is verlopen. Als je wilt kun je een nieuwe authorisatie aanvragen.';
exit();
}
}
//If authentication TRUE and period true, set session values
$_SESSION['logged_in'] = TRUE;
$_SESSION['id'] = $result['id'];
$_SESSION['registerdate'] = $result['registerdate'];
//Set session login-time and make it expire after being 60 minutes inactive
$_SESSION['start'] = time();
$_SESSION['expire'] = $_SESSION['start'] + (120 * 60);
header("Location: http://www.domein.nl");
//echo 'succesvol ingelogd. '.$_SESSION['logged_in']; (Hier krijg ik dus wel de boolean TRUE terug)
exit();
}
else {
header ('Refresh:1;url=../registreer');
echo 'Username niet bekend.';
exit();
}
}
}
//If the result from the database is not 1, go back to the login.php
else {
header ('Refresh:1;url=../login');
echo 'Onjuiste username en/of password ingevuld.';
exit();
}
}
catch(PDOException $e) {
header ('Refresh:1;url=../login');
echo 'Er is een fout opgetreden. Probeer het later nog eens.';
exit();
}
}
else {
header ('Refresh:0;url=../login');
exit();
}
}
?>
Dit is het hele deel uit het inlogscript.
Op de beveiligde pagina begin ik met de code die ik in mijn vraag heb gezet. Daarna direct de html van de pagina.
"password" is volgens mij een gereserveerd woord - gaat je query wel goed, moeten hier geen `backticks` omheen?
Introduceer anders eens wat breekpunten in je code met die('een omschrijvende tekst') om te zien waar je code blijft hangen.
Verder zou ik geen header('Refresh...') gebruiken maar enkel header('Location: ...').
Tot slot is het niet verstandig om hints te geven over wat er mis is met een loginpoging omdat dat inbraakpogingen vergemakkelijkt.
- Password is inderdaad een reserved word, dat ga ik aanpassen.
- De backticks kunnen het probleem niet zijn, dan zou ik nooit de sessiewaarden terugkrijgen, dus de query gaat goed. Over het wel of niet gebruik van backticks, ik gebruik ze nooit en heb dar tot nog toe nooit problemen mee gehad. Waarom zou je ze moeten gebruiken?
- Waarom zou je geen Refresh, maar Location gebruiken, anders dan voor de hints die ik geef met de foute inlog. Dat vind ik wel logisch en sloop ik er uit zodra de zaak goed werkt. Nu vind ik het wel handig (ze eenmaal hebbende) om te zien waar de zaak evt. vastloopt.
En dan: Het heeft niet zoveel zin om breekpunten in te voeren, want de code blijft niet 'hangen'. De sessiewaarden worden netjes aangemaakt, maar pas bij een tweede keer inloggen doorgegeven aan de betreffende pagina.
Dit gebeurt trouwens alleen bij de host, in de lokale wamp-omgeving gaat het wel goed.
Edit: Na het aanpassen van if(!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] == FALSE) naar:
if(empty($_SESSION['logged_in']))
is het probleem opgelost.
Toch vind ik dit wel vreemd, het zou toch eigenlijk niet uit moeten maken?
Gewijzigd op 21/01/2016 21:56:48 door tortuga web
En nee, !isset(...) || ... == false omwisselen voor empty(...) zou niet uit moeten maken, want dit is (hier in ieder geval) equivalent. Je zou kunnen proberen session_write_close() aan te roepen nadat je klaar bent met het wegschrijven van data alvorens je redirect? Maak je gebruik van frames ofzo? Mogelijk heeft die host specifieke configuratie ofzo? Heeft je host een FAQ of je zou eens een ticket in kunnen sturen om opheldering te vragen want het klinkt nogal vreemd allemaal. Maar de hier geplaatste code zijn fragmenten dus het totale plaatje kan ik sowieso niet echt overzien dan...