inloggen lukt pas na 2e keer gegevens invoeren

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Senior, Medior and Junior SAP HANA Developer

Vacature details Vakgebied: Software/IT Opleiding: Medior Werklocatie: Veldhoven Vacature ID: 12696 Introductie Our client is the world's leading provider of lithography systems for the semiconductor industry, manufacturing complex machines that are critical to the production of integrated circuits or chips. Our purpose is “unlocking the potential of people and society by pushing technology to new limits”. We do this guided by the principles “Challenge”, “Collaborate” and “Care”. Wat verwachten we van jou? SAP Certified Application Associate - SAP HANA Cloud Modeling (training and/or certification) Bachelor degree or higher Excellent understanding of SAP HANA (2.0 / Cloud), Data Modelling and writing

Bekijk vacature »

Tortuga web

tortuga web

21/01/2016 19:18:12
Quote Anchor link
Hallo,
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)
PHP script in nieuw venster Selecteer het PHP script
1
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();
    }

?>

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

PHP hulp

20/04/2024 10:04:28
 
Thomas van den Heuvel

Thomas van den Heuvel

21/01/2016 19:24:49
Quote Anchor link
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.
 
Tortuga web

tortuga web

21/01/2016 19:43:09
Quote Anchor link
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
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();
        }
    }

?>

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.
 
Thomas van den Heuvel

Thomas van den Heuvel

21/01/2016 19:59:38
Quote Anchor link
Waarom een foreach over $results als deze maar uit één resultaatrij bestaat?

"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.
 
Tortuga web

tortuga web

21/01/2016 21:16:21
Quote Anchor link
- Ja, dat van de foreach klopt, dat zal ik aanpassen.
- 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
 
Thomas van den Heuvel

Thomas van den Heuvel

21/01/2016 22:43:14
Quote Anchor link
Voor debugging is dat wellicht handig, maar dan zou ik breekpunten gebruiken, die je als de code is getest, na afloop verwijdert. Want zoals aangegeven is het niet verstandig om hints te geven wat er niet klopt aan de login.

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...
 



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.