Inloggen werkt niet goed

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

The Force

The Force

08/10/2008 20:20:00
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>


Checklogin.php controleert de code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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");
}
?>


Op de beveiligde pagina wordt gecontroleerd of ingelogd is door de sessie te controleren:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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');
}

?>


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
 
PHP hulp

PHP hulp

25/04/2024 20:55:50
 
Noppes

Noppes

08/10/2008 20:24:00
Quote Anchor link
Zet boven aan je script eens:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
ini_set('display_errors',1);
error_reporting(E_ALL);
?>


Waar o waar is de controle of er daadwerkelijk wel iets gepost is en of het een post is welke jij verwacht.
 
The Force

The Force

08/10/2008 20:35:00
Quote Anchor link
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
 
Marcel K

Marcel K

08/10/2008 21:54:00
Quote Anchor link
als ik het goed heb mag er voor session_start() geen lege regels of comment-regels staat, dus probeer eens:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
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
 
Jan Koehoorn

Jan Koehoorn

08/10/2008 21:55:00
Quote Anchor link
Lege regels en/of comment regels zijn allebei toegestaan. Zolang je maar geen output richting de browser stuurt voor de headers verstuurd zijn.
 
- -

- -

08/10/2008 22:06:00
Quote Anchor link
Jep. Zo is bijvoorbeeld een lege regel of een spatie voor <?php al "dodelijk" :)
 
Klaasjan Boven

Klaasjan Boven

08/10/2008 22:24:00
Quote Anchor link
Maar dat kan het probleem niet zijn anders kreeg je wel een foutmelding, post je hele code eens
 
The Force

The Force

08/10/2008 23:01:00
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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");
}
?>


M.v.g.,

Theforce117
Gewijzigd op 01/01/1970 01:00:00 door The Force
 
The Force

The Force

12/10/2008 21:18:00
Quote Anchor link
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
Gewijzigd op 01/01/1970 01:00:00 door The Force
 
Arnout Rijpkema

arnout Rijpkema

12/10/2008 21:57:00
Quote Anchor link
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
 
--

--

12/10/2008 22:07:00
Quote Anchor link
Probeer eens om je pagina te openen in Kladblok en te kijken of er nog witte ruimte voor
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php zit.
 
The Force

The Force

12/10/2008 22:31:00
Quote Anchor link
@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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php...
 
Klaasjan Boven

Klaasjan Boven

12/10/2008 23:38:00
Quote Anchor link
Doe op eens print_r($_SESSION);
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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");
}
?>
 
The Force

The Force

13/10/2008 11:30:00
Quote Anchor link
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?
 
- SanThe -

- SanThe -

13/10/2008 11:56:00
Quote Anchor link
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" />
 
The Force

The Force

13/10/2008 16:50:00
Quote Anchor link
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?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.