Inloggen werkt niet goed
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
Waar o waar is de controle of er daadwerkelijk wel iets gepost is en of het een post is welke jij verwacht.
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
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
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
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
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
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");
}
?>
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?
<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?