Inloggen werkt niet goed
Beste PHP'ers,
In de website van een kennis heb ik enige tijd geleden een inlogscript geimplementeerd. Hoewel deze heel eenvoudig in elkaar steekt, werkt hij bij sommige mensen structureel niet (in IE). Het vreemde is dat als iemand correct inlogt, er geen sessie aangemaakt wordt. Logt hij nog een keer correct in, dan wel. Zelf heb ik hier geen last van...
Om zeker te weten dat het aan het script ligt, heb ik het script uit de website gehaald, met hetzelfde resultaat. FF gebruikers loggen gewoon in, bij IE kunnen enkele gewoon inloggen.
Om in te loggen gewoon een formulier:
Checklogin.php controleert de code:
Op de beveiligde pagina wordt gecontroleerd of ingelogd is door de sessie te controleren:
Er hebben al meerdere programmeurs naar dit probleem gekeken, geen weet de oplossing. Het uitlezen van de sessiewaardes laat zien dat hij bij sommige mensen na de eerste keer succesvol inloggen geen sessie wordt gemaakt. Waarom gaat dit de tweede keer dan wel goed? En waarom IE soms niet, mozilla en chrome wel? Als iemand een tip heeft, dan hoor ik het graag!
Bij voorbaat dank,
Theforce117
In de website van een kennis heb ik enige tijd geleden een inlogscript geimplementeerd. Hoewel deze heel eenvoudig in elkaar steekt, werkt hij bij sommige mensen structureel niet (in IE). Het vreemde is dat als iemand correct inlogt, er geen sessie aangemaakt wordt. Logt hij nog een keer correct in, dan wel. Zelf heb ik hier geen last van...
Om zeker te weten dat het aan het script ligt, heb ik het script uit de website gehaald, met hetzelfde resultaat. FF gebruikers loggen gewoon in, bij IE kunnen enkele gewoon inloggen.
Om in te loggen gewoon een formulier:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<form method="POST" action="checklogin.php" name="login">
UserID: <input name="id" type="text" />
Password: <input name="pass" type="password" />
<input type="hidden" name="action" value="loginvenster1" />
<input type="submit" value="Login" />
</form>
UserID: <input name="id" type="text" />
Password: <input name="pass" type="password" />
<input type="hidden" name="action" value="loginvenster1" />
<input type="submit" value="Login" />
</form>
Checklogin.php controleert de code:
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
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
<?php
//Open sessions.
session_start();
//Controleer welk inlogmenu gebruikt is en stel in welk wachtwoord daar voor nodig is. In de website zitten namelijk twee verschillende inlogvensters...
switch ($_POST['action']) {
case 'loginvenster1':
$id = "gebruikersnaam";
$pass = "167cd0c7f052608fbeace43abdfbf792e034cbd7";
$location = "inlogpagina1.php";
$referrer = "beveiligdepagina1.php"; break;
case 'loginvenster2':
$id = "gebruikersnaam";
$pass = "0307ccb8f25d95c29871da7abd56929376a093f2";
$location = "inlogpagina2.php";
$referrer = "beveiligdepagina2.php"; break;
}
//Vergelijk of het ingevoerde overeenkomt met het benodigde wachtwoord.
if($_POST['id'] == $id && sha1($_POST['pass']) == $pass) {
$_SESSION[$_POST['action']] = "Session" . $_POST['action'];
header('Location: ' . $referrer);
} else {
header('Location: ' . $location . "?inlog=false");
}?>
//Open sessions.
session_start();
//Controleer welk inlogmenu gebruikt is en stel in welk wachtwoord daar voor nodig is. In de website zitten namelijk twee verschillende inlogvensters...
switch ($_POST['action']) {
case 'loginvenster1':
$id = "gebruikersnaam";
$pass = "167cd0c7f052608fbeace43abdfbf792e034cbd7";
$location = "inlogpagina1.php";
$referrer = "beveiligdepagina1.php"; break;
case 'loginvenster2':
$id = "gebruikersnaam";
$pass = "0307ccb8f25d95c29871da7abd56929376a093f2";
$location = "inlogpagina2.php";
$referrer = "beveiligdepagina2.php"; break;
}
//Vergelijk of het ingevoerde overeenkomt met het benodigde wachtwoord.
if($_POST['id'] == $id && sha1($_POST['pass']) == $pass) {
$_SESSION[$_POST['action']] = "Session" . $_POST['action'];
header('Location: ' . $referrer);
} else {
header('Location: ' . $location . "?inlog=false");
}?>
Op de beveiligde pagina wordt gecontroleerd of ingelogd is door de sessie te controleren:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
//Controleer of de gebruiker ingelogd is.
session_start();
if(isset($_SESSION['loginvenster1']) && $_SESSION['loginvenster1'] == 'Sessionloginvenster1') { ?>
<p>Succesvol ingelogd</p>
<?php
} else {
header('Location: inlogpagina1.php');
}
?>
//Controleer of de gebruiker ingelogd is.
session_start();
if(isset($_SESSION['loginvenster1']) && $_SESSION['loginvenster1'] == 'Sessionloginvenster1') { ?>
<p>Succesvol ingelogd</p>
<?php
} else {
header('Location: inlogpagina1.php');
}
?>
Er hebben al meerdere programmeurs naar dit probleem gekeken, geen weet de oplossing. Het uitlezen van de sessiewaardes laat zien dat hij bij sommige mensen na de eerste keer succesvol inloggen geen sessie wordt gemaakt. Waarom gaat dit de tweede keer dan wel goed? En waarom IE soms niet, mozilla en chrome wel? Als iemand een tip heeft, dan hoor ik het graag!
Bij voorbaat dank,
Theforce117
Gewijzigd op 01/01/1970 01:00:00 door The Force
Zet boven aan je script eens:
Waar o waar is de controle of er daadwerkelijk wel iets gepost is en of het een post is welke jij verwacht.
Waar o waar is de controle of er daadwerkelijk wel iets gepost is en of het een post is welke jij verwacht.
Beste Noppes,
Bedankt voor de snelle reactie! Uw scriptje zodat alle errors weergegeven worden heb ik wel in mijn bestand staan, maar om de code niet te lang te maken heb ik dat er uit gehaald. In de forum regels staat dat je niet hele code moet plakken, alleen snippets ter ondersteuning. Er worden overigs geen fouten weergegeven.
De controle waar u het over heeft zit in de 'echte' versie wel. Om de oorzaak te vinden heb ik echter de code beperkt. Het gaat mij in deze topic niet om de veiligheid van dit script. Ik hoop met deze gestripte versie het probleem te vinden, zodat ik deze in de echte website kan verwijderen.
M.v.g.,
Theforce117
Bedankt voor de snelle reactie! Uw scriptje zodat alle errors weergegeven worden heb ik wel in mijn bestand staan, maar om de code niet te lang te maken heb ik dat er uit gehaald. In de forum regels staat dat je niet hele code moet plakken, alleen snippets ter ondersteuning. Er worden overigs geen fouten weergegeven.
De controle waar u het over heeft zit in de 'echte' versie wel. Om de oorzaak te vinden heb ik echter de code beperkt. Het gaat mij in deze topic niet om de veiligheid van dit script. Ik hoop met deze gestripte versie het probleem te vinden, zodat ik deze in de echte website kan verwijderen.
M.v.g.,
Theforce117
als ik het goed heb mag er voor session_start() geen lege regels of comment-regels staat, dus probeer eens:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
session_start();
zet hier je code, dus geen lege regels tussen start van script en session_start
?>
session_start();
zet hier je code, dus geen lege regels tussen start van script en session_start
?>
Gewijzigd op 01/01/1970 01:00:00 door Marcel K
Lege regels en/of comment regels zijn allebei toegestaan. Zolang je maar geen output richting de browser stuurt voor de headers verstuurd zijn.
Jep. Zo is bijvoorbeeld een lege regel of een spatie voor <?php al "dodelijk" :)
Maar dat kan het probleem niet zijn anders kreeg je wel een foutmelding, post je hele code eens
Bedankt voor de reacties! Ik zal mijn commentaar e.d. voor session_start() weghalen. Bij mij werkt het script echter, dus ik moet even wachten voordat ik het resultaat weet. Zodra ik het resultaat heb zal ik dat hier vermelden.
Hier volledige code:
Inlogpagina:
Beveiligde pagina's:
En ten slotte de pagina die de loginvensters controleert:
M.v.g.,
Theforce117
Hier volledige code:
Inlogpagina:
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
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
<?php
session_start();
ini_set('display_errors',1);
error_reporting(E_ALL);
//Controleer of de gebruiker ingelogd is.
if(isset($_SESSION['leden']) && $_SESSION['leden'] == 'Sessionleden') {
header('Location: ledenrepetoire.php');
}
else { ?>
<html>
<head>
<title>Titel</title>
</head>
<body bgcolor="#ff9933">
<h2>Login leden</h2>
<?php
if(isset($_GET['inlog']) && $_GET['inlog'] == "false") {
echo "<h3>Het ingevoerde wachtwoord is niet correct. Probeer het opnieuw.</h3>";
}
?>
<form method="POST" action="checklogin.php" name="login">
UserID: <input name="id" type="text" />
Password: <input name="pass" type="password" />
<input type="hidden" name="action" value="leden" />
<input type="submit" value="Login" />
</form>
</body>
</html>
<?php } ?>
session_start();
ini_set('display_errors',1);
error_reporting(E_ALL);
//Controleer of de gebruiker ingelogd is.
if(isset($_SESSION['leden']) && $_SESSION['leden'] == 'Sessionleden') {
header('Location: ledenrepetoire.php');
}
else { ?>
<html>
<head>
<title>Titel</title>
</head>
<body bgcolor="#ff9933">
<h2>Login leden</h2>
<?php
if(isset($_GET['inlog']) && $_GET['inlog'] == "false") {
echo "<h3>Het ingevoerde wachtwoord is niet correct. Probeer het opnieuw.</h3>";
}
?>
<form method="POST" action="checklogin.php" name="login">
UserID: <input name="id" type="text" />
Password: <input name="pass" type="password" />
<input type="hidden" name="action" value="leden" />
<input type="submit" value="Login" />
</form>
</body>
</html>
<?php } ?>
Beveiligde pagina's:
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
//Controleer of de gebruiker ingelogd is.
session_start();
ini_set('display_errors',1);
error_reporting(E_ALL);
if(isset($_SESSION['leden']) && $_SESSION['leden'] == 'Sessionleden') { ?>
<html>
<head>
<title>Titel</title>
</head>
<body bgcolor="#FF9933">
<h2>Succesvol ingelogd!</h2>
<p>Ledenpagina</p>
<h3>Sessie gegevens</h3>
<p><?php print_r($_SESSION); ?></p>
</body>
</html>
<?php
} else {
header('Location: ledeninloggen.php');
}
?>
//Controleer of de gebruiker ingelogd is.
session_start();
ini_set('display_errors',1);
error_reporting(E_ALL);
if(isset($_SESSION['leden']) && $_SESSION['leden'] == 'Sessionleden') { ?>
<html>
<head>
<title>Titel</title>
</head>
<body bgcolor="#FF9933">
<h2>Succesvol ingelogd!</h2>
<p>Ledenpagina</p>
<h3>Sessie gegevens</h3>
<p><?php print_r($_SESSION); ?></p>
</body>
</html>
<?php
} else {
header('Location: ledeninloggen.php');
}
?>
En ten slotte de pagina die de loginvensters controleert:
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
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
<?php
//Open sessions.
session_start();
ini_set('display_errors',1);
error_reporting(E_ALL);
//Controleer welk inlogmenu gebruikt is en stel in welk wachtwoord daar voor nodig is.
switch ($_POST['action']) {
case 'leden':
$id = "gebruikersnaam";
$pass = "433cd0c7f052608fbeace43abdfbf792e034cbd7";
$location = "inlogvenster1.php";
$referrer = "beveiligdepagina1.php"; break;
case 'inlogvenster2':
$id = "gebruikersnaam";
$pass = "0807ccb8d25d95c29871da7abd56929376a093f2";
$location = "inlogvenster2.php";
$referrer = "beveiligdepagina2.php"; break;
}
//Vergelijk of het ingevoerde overeenkomt met het benodigde wachtwoord.
if($_POST['id'] == $id && sha1($_POST['pass']) == $pass) {
$_SESSION[$_POST['action']] = "Session" . $_POST['action'];
header('Location: ' . $referrer);
} else {
//header('Location: ' . $location . "?inlog=false");
}
?>
//Open sessions.
session_start();
ini_set('display_errors',1);
error_reporting(E_ALL);
//Controleer welk inlogmenu gebruikt is en stel in welk wachtwoord daar voor nodig is.
switch ($_POST['action']) {
case 'leden':
$id = "gebruikersnaam";
$pass = "433cd0c7f052608fbeace43abdfbf792e034cbd7";
$location = "inlogvenster1.php";
$referrer = "beveiligdepagina1.php"; break;
case 'inlogvenster2':
$id = "gebruikersnaam";
$pass = "0807ccb8d25d95c29871da7abd56929376a093f2";
$location = "inlogvenster2.php";
$referrer = "beveiligdepagina2.php"; break;
}
//Vergelijk of het ingevoerde overeenkomt met het benodigde wachtwoord.
if($_POST['id'] == $id && sha1($_POST['pass']) == $pass) {
$_SESSION[$_POST['action']] = "Session" . $_POST['action'];
header('Location: ' . $referrer);
} else {
//header('Location: ' . $location . "?inlog=false");
}
?>
M.v.g.,
Theforce117
Gewijzigd op 01/01/1970 01:00:00 door The Force
Hallo PHP'ers,
Het weghalen van het commentaar voor session_start() heeft niet geholpen. Op php.net wordt op de pagina van session_start() ook gewoon commentaar voor session_start() gezet. Ziet iemand nog iets vreemds in de code?
Er wordt gebruik gemaakt van PHP 5.2.6. De sessioninstellingen zijn volgens phpinfo() hetzelfde als de standaardinstellingen. En weet iemand een situatie waarin php structureel bij een deel van de bezoekers anders reageert als bij anderen?
Bij voorbaat dank,
Theforce117
Het weghalen van het commentaar voor session_start() heeft niet geholpen. Op php.net wordt op de pagina van session_start() ook gewoon commentaar voor session_start() gezet. Ziet iemand nog iets vreemds in de code?
Er wordt gebruik gemaakt van PHP 5.2.6. De sessioninstellingen zijn volgens phpinfo() hetzelfde als de standaardinstellingen. En weet iemand een situatie waarin php structureel bij een deel van de bezoekers anders reageert als bij anderen?
Bij voorbaat dank,
Theforce117
Gewijzigd op 01/01/1970 01:00:00 door The Force
Hallo,
Ik kan niet uit vinden waar jij iets in $_SESSION['leden'] stopt.
Of dit ligt aan mij, maar daar kan de fout wel eens zitten.
Groeten, arnout
Ik kan niet uit vinden waar jij iets in $_SESSION['leden'] stopt.
Of dit ligt aan mij, maar daar kan de fout wel eens zitten.
Groeten, arnout
Probeer eens om je pagina te openen in Kladblok en te kijken of er nog witte ruimte voor
@arnout Rijpkema: in het laatste codeblok staat $_SESSION[$_POST['action']] = "Session" . $_POST['action'];. In het formulier staat een hidden 'action' met value 'leden'. Oftewel: $_SESSION['leden'] = "Sessionleden".
@Evert: Alle bestanden zijn nagelopen: er zit geen witruimte voor elke
@Evert: Alle bestanden zijn nagelopen: er zit geen witruimte voor elke
Doe op eens print_r($_SESSION);
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
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
<?php
//Open sessions.
session_start();
ini_set('display_errors',1);
error_reporting(E_ALL);
//Controleer welk inlogmenu gebruikt is en stel in welk wachtwoord daar voor nodig is.
switch ($_POST['action']) {
case 'leden':
$id = "gebruikersnaam";
$pass = "433cd0c7f052608fbeace43abdfbf792e034cbd7";
$location = "inlogvenster1.php";
$referrer = "beveiligdepagina1.php"; break;
case 'inlogvenster2':
$id = "gebruikersnaam";
$pass = "0807ccb8d25d95c29871da7abd56929376a093f2";
$location = "inlogvenster2.php";
$referrer = "beveiligdepagina2.php"; break;
}
//Vergelijk of het ingevoerde overeenkomt met het benodigde wachtwoord.
if($_POST['id'] == $id && sha1($_POST['pass']) == $pass) {
$_SESSION[$_POST['action']] = "Session" . $_POST['action'];
print_r($_SESSION); // geeft wel een fout op de volgende regel
header('Location: ' . $referrer);
} else {
//header('Location: ' . $location . "?inlog=false");
}
?>
//Open sessions.
session_start();
ini_set('display_errors',1);
error_reporting(E_ALL);
//Controleer welk inlogmenu gebruikt is en stel in welk wachtwoord daar voor nodig is.
switch ($_POST['action']) {
case 'leden':
$id = "gebruikersnaam";
$pass = "433cd0c7f052608fbeace43abdfbf792e034cbd7";
$location = "inlogvenster1.php";
$referrer = "beveiligdepagina1.php"; break;
case 'inlogvenster2':
$id = "gebruikersnaam";
$pass = "0807ccb8d25d95c29871da7abd56929376a093f2";
$location = "inlogvenster2.php";
$referrer = "beveiligdepagina2.php"; break;
}
//Vergelijk of het ingevoerde overeenkomt met het benodigde wachtwoord.
if($_POST['id'] == $id && sha1($_POST['pass']) == $pass) {
$_SESSION[$_POST['action']] = "Session" . $_POST['action'];
print_r($_SESSION); // geeft wel een fout op de volgende regel
header('Location: ' . $referrer);
} else {
//header('Location: ' . $location . "?inlog=false");
}
?>
Met print_r($_SESSION) krijg ik bij mij de correcte sessiegegevens:
Array
(
[leden] => Sessionleden
[inlogvenster2] => Sessioninlogvenster2
)
Bij mensen waar de website niet goed werkte wordt de eerste keer geen sessievariabele aangemaakt en na de tweede keer inloggen wel. Kan dit wel aan PHP liggen? Aangezien PHP server-side is zou het overal op dezelfde manier moeten reageren. Maar aan de andere kant: waar kan het dan wel aan liggen, aangezien deze code bijna alleen uit PHP bestaat?
Array
(
[leden] => Sessionleden
[inlogvenster2] => Sessioninlogvenster2
)
Bij mensen waar de website niet goed werkte wordt de eerste keer geen sessievariabele aangemaakt en na de tweede keer inloggen wel. Kan dit wel aan PHP liggen? Aangezien PHP server-side is zou het overal op dezelfde manier moeten reageren. Maar aan de andere kant: waar kan het dan wel aan liggen, aangezien deze code bijna alleen uit PHP bestaat?
Misschien moet je met je html-headers de cache legen.
<meta http-equiv="expires" content="0" />
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="cache-control" content="no-cache" />
Het cache had inderdaad roet in het eten kunnen gooien. Helaas heb ik net een mail ontvangen dat het probleem nog steeds aanwezig is. sessions.use_cookies staat in het php ini bestand op "on" en sessions.use_only_cookies staat op "off". Zou het probleem hiermee te maken kunnen hebben? Dat IE bij bepaalde instellingen anders om gaat met cookies als dat het zou moeten?




