Login en logout

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Arno van Zanten

Arno van Zanten

25/03/2023 12:51:42
Quote Anchor link
Hallo, ik heb een login script, dat normaal werkt, maar nu wil ik het zelfde script gebruiken op een andere site, krijg ik steeds fouten na fouten.
Een van die fouten is deze:
Quote:
Warning: Undefined array key "menu" in /data/sites/web/******/www/test/inc/login.php on line 2


daarna als ik inlog, wat werkt, krijg ik deze fouten :

Quote:
Warning: Cannot modify header information - headers already sent by (output started at /data/sites/web/*******/www/test/inc/dbase.php:13) in /data/sites/web/*******/www/test/inc/login.php on line 43


daarn doe ik een refresh, waardoor ik daarna wil uitloggen, dan krijg ik deze fout

Quote:
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at [email protected] to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.


de index.php
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
<?php
        session_start();
        error_reporting(0);
    
        ini_set('display_errors', 1);
        ini_set('display_startup_errors', 1);
        error_reporting(E_ALL);
        
        include('./inc/dbase.php');
        
        if(!isset($_SESSION['Username'])){
            include("./inc/login.php");
        }
else{
            echo "<br>Welcome User: ";
            echo $_SESSION['Username'];
        }

        echo "<br><a href='./inc/logout.php'>logout</a>";
?>


inlog.php
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
    if($_GET['menu'] == 'login' && $_GET['action'] == 'check' ) {
        $user = $_POST['username'];
        $pass = md5($_POST['password']);
        $key = $_POST['key'];
                
        $sql = "SELECT * FROM AdminUsers WHERE Username='".$user."' AND Passwd='".$pass."' AND LoginKey='".$key."'";
        $result = mysqli_query($connect, $sql);
        $logindetails = mysqli_fetch_all($result, MYSQLI_ASSOC);
        
        foreach($logindetails as $detail) {
                echo "This we got from DBase<br>";
                echo "Username : ".$detail['Username']."<br>";
                echo "Password : ".$detail['Passwd']."<br>";
                echo "LoginKey : ".$detail['LoginKey']."<br>";
                echo "Name : ".$detail['Name']."<br>";
                echo "Level : ".$detail['Access']."<br>";
        }

        echo "<div class='login'>";
        if($detail['Username'] == $user) {
            echo "<br>Username OK<br>";
        }
else {
            echo "Username not OK<br>";
        }

        if($detail['Passwd'] == $pass) {
            echo "Password OK<br>";
        }
else {
            echo "Password not OK<br>";
        }

        if($detail['LoginKey'] == $key) {
            echo "Key OK<br>";
        }
else {
            echo "Key not OK<br>";
        }


        echo "<br>Nu gaan we een sessie aanmaken<br>";
/*        session_start(); */
        $_SESSION['Name'] = $detail['Name'];
        $_SESSION['Username'] = $detail['Username'];
        $_SESSION['Passwd'] = $detail['Passwd'];
        $_SESSION['Level'] = $detail['Access'];
        $_SESSION['ID'] = $detail['ID'];
        header("location: ./index.php");
        echo "</div>";
    }
else{

?>

<html>
    <head>
        <title>Sexy Devil</title>
        <link href='inc/login.css' rel='stylesheet' type='text/css' media='screen'/>
    </head>
    <body>
    <!-- Start framework login page -->
<?php    echo"
        <div class='login'>
            <form id='login' action='"
.htmlspecialchars($_SERVER["PHP_SELF"]."?menu=login&action=check")."' method='POST'>
                <fieldset>
                    <input type='text' name='username' placeholder='Username'>
                    <input type='password' name='password' placeholder='Password'>
                    <input type='text' name='key' placeholder='Keycode'>
                    <button type='submit' name='submit'>Login</button>
                </fieldset>
            </form>
            <img id='img-login' src='./img/page/Sexy-Devil.jpg'>
        </div>"
;
?>
        
    <!-- End framework login page -->
    </body>
</html>
<?php
    }
?>

logout.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
session_start();
        error_reporting(0);
    
        ini_set('display_errors', 1);
        ini_set('display_startup_errors', 1);
        error_reporting(E_ALL);
        
unset($_SESSION['Username']);
session_destroy();
header("location : ./index.php");
?>

Waar zit hier de fout?
Normaal werkt het op een andere site wel
Gewijzigd op 25/03/2023 13:22:04 door - Ariën -
 
PHP hulp

PHP hulp

29/03/2024 10:13:18
 
- Ariën  -
Beheerder

- Ariën -

25/03/2023 13:07:11
Quote Anchor link
1) De 'Internal Server Error' heeft 1001 oorzaken, die je kan vinden in de error-log file.
De melding zegt het al: "More information about this error may be available in the server error log."
Dus ga eens graven.....

2) 'Undefined array key "menu"' kan je vertalen naar Ongedefineerde array sleutel 'menu'.
Je roept in je array 'menu' op. Maar die bestaat niet.

3) 'Cannot modify header information' wordt op internet uitgebreid besproken, dan die error krijg je als er output voor een header() staat. Dit kunnen witregels voor de php-tags zijn, maar ook HTML. En dat mag juist niet. De header moet als eerste uitgevoerd worden. Het kan ook in combinatie met een eerdere foutmelding zijn. Dus als je die error oplost, dan kan deze melding ook meteen verdwijnen.

Verder is dit wel vreemd:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
// start sessie (dat is prima)
        session_start();

// Ik wil geen foutafhandeling (waarom wil je dat bij het testen?)
        error_reporting(0);
// Ik wil WEL fouten tonen (ah, dat willen we graag!)
        ini_set('display_errors', 1);
        ini_set('display_startup_errors', 1);
// Ik wil wel foutafhandeling (en nu op eens weer wel?)
        error_reporting(E_ALL);
?>


Je komt een beetje onzeker over op deze manier ;-)
De beste oplossing:
Maak in je configuratie-bestand een waarde waarin je kan aangeven of je site in de test-modus staat.
Zo ja, dan zet je alle foutafhandeling aan. En zo nee, dan zet je alle foutafhandeling uit.

En zorg er ook voor dat je niet overal in elk bestand je code hoeft te herhalen. Ik noem dit DRY:
Don't
Repeat
Yourself

Je kan repeterende code in een include() zetten, of anders in een eigen gemaakte functie.

Nog een paar dingetjes over je code:
- Ook zie ik dat je een wachtwoord opslaat in een sessie. met welke reden is dat nodig? Het password is ene sleutel, en die heb je alleen nodig als je ergens binnen wilt komen. Eenmaal binnen heb je die NOOIT meer nodig.
- En Wachtwoorden hoor je met password_hash() te hashen, en zeker niet met het onveilige md5(). Controleren kan met password_verify().

En dan ook even nog een huishoudelijke mededeling:
Ik weet niet wat de strekking van je site zal zijn. Maar volgens de huisregels is het niet toegestaan om naar websites te refereren die voor 18+ publiek zijn. Dus graag hier alvast op letten. Alvast bedankt.
Gewijzigd op 25/03/2023 13:21:14 door - Ariën -
 
Arno van Zanten

Arno van Zanten

25/03/2023 13:23:59
Quote Anchor link
- Ariën - op 25/03/2023 13:07:11:
1) De 'Internal Server Error' heeft 1001 oorzaken, die je kan vinden in de error-log file.
De melding zegt het al: "More information about this error may be available in the server error log."
Dus ga eens graven.....


Response header name 'location ' contains invalid characters, aborting request
Dit vind ik terug in de server log over de logout.php

Toevoeging op 25/03/2023 13:25:59:

Het zelfde gebruik ik ook op happy-truffles.com en daar werkt het wel.
 
- Ariën  -
Beheerder

- Ariën -

25/03/2023 13:27:05
Quote Anchor link
Ik gok op de spatie voor de dubbele punt.

Zo ziet de perfecte location-header eruit.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
header('Location: http://www.example.com/');
exit();
?>


Let erop dat je steevast ook exit(); daarna gebruikt.

Toevoeging op 25/03/2023 13:28:18:

Arno van Zanten op 25/03/2023 13:23:59:
Het zelfde gebruik ik ook op happy-truffles.com en daar werkt het wel.


Elke server werkt weer anders. Maar het advies om netjes volgens de richtlijnen en voorbeelden te programmeren. Gebruik ook een goede editor die je tegen zulke typefouten beschermt.
Gewijzigd op 25/03/2023 13:27:19 door - Ariën -
 
Arno van Zanten

Arno van Zanten

25/03/2023 13:30:55
Quote Anchor link
Zelfde server, alles op transip
 
- Ariën  -
Beheerder

- Ariën -

25/03/2023 13:32:47
Quote Anchor link
Dan lijkt het mij sterk. Maar goed, zoals ik al zei: Werk netjes en volgens de richtlijnen.
Code-snippets kunnen helpen.
 
Arno van Zanten

Arno van Zanten

25/03/2023 14:19:11
Quote Anchor link
header in grote lijn opgelost, maar zodra ik inlog, blijft hij zeuren met deze fout die ik niet begrijp.

Quote:
Warning: Cannot modify header information - headers already sent by (output started at /data/sites/web/[site url]/www/test/index.php:6) in /data/sites/web/[site url]/www/test/inc/login.php on line 42


en als ik dat bekijk.
index.php
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
        session_start();
                
        include('./inc/dbase.php');
?>

<html>
    <head>
        <title>[Site name]</title>
        <link href='inc/login.css' rel='stylesheet' type='text/css' media='screen'/>
    </head>
    <body>
    <!-- Start framework login page -->
<?php        
        if(!isset($_SESSION['Username'])){
            include("./inc/login.php");
        }
else{
            echo "<br>Welcome User: ";
            echo $_SESSION['Username'];
            echo "<br><a href='./inc/logout.php'>logout</a>";
        }

        
?>

<!-- End framework login page -->
    </body>
</html>

en de login.php
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
<?php
    if($_GET['menu'] == 'login' && $_GET['action'] == 'check' ) {
        $user = $_POST['username'];
        $pass = md5($_POST['password']);
        $key = $_POST['key'];
                
        $sql = "SELECT * FROM AdminUsers WHERE Username='".$user."' AND Passwd='".$pass."' AND LoginKey='".$key."'";
        $result = mysqli_query($connect, $sql);
        $logindetails = mysqli_fetch_all($result, MYSQLI_ASSOC);
        
        foreach($logindetails as $detail) {
                echo "This we got from DBase<br>";
                echo "Username : ".$detail['Username']."<br>";
                echo "Password : ".$detail['Passwd']."<br>";
                echo "LoginKey : ".$detail['LoginKey']."<br>";
                echo "Name : ".$detail['Name']."<br>";
                echo "Level : ".$detail['Access']."<br>";
        }

/*        echo "<div class='login'>";
        if($detail['Username'] == $user) {
            echo "<br>Username OK<br>";
        } else {
            echo "Username not OK<br>";
        }
        if($detail['Passwd'] == $pass) {
            echo "Password OK<br>";
        } else {
            echo "Password not OK<br>";
        }
        if($detail['LoginKey'] == $key) {
            echo "Key OK<br>";
        } else {
            echo "Key not OK<br>";
        }
*/

        $_SESSION['Name'] = $detail['Name'];
        $_SESSION['Username'] = $detail['Username'];
        $_SESSION['Passwd'] = $detail['Passwd'];
        $_SESSION['Level'] = $detail['Access'];
        $_SESSION['ID'] = $detail['ID'];

        header("location: ./index.php");
        exit();
        echo "</div>";
    }[
/code]
en de exit pakt hij ook niet.
 
- Ariën  -
Beheerder

- Ariën -

25/03/2023 14:29:24
Quote Anchor link
Die echo's in je foreach daarvoor zijn ook output.

Verder heb ik nog wat adviezen gegeven over onder meer de veiligheid en de wachtwoorden. Ik hoop dat je daar nog wat mee doet.
Gewijzigd op 25/03/2023 14:29:48 door - Ariën -
 
Arno van Zanten

Arno van Zanten

25/03/2023 14:44:39
Quote Anchor link
- Ariën - op 25/03/2023 14:29:24:
Verder heb ik nog wat adviezen gegeven over onder meer de veiligheid en de wachtwoorden. Ik hoop dat je daar nog wat mee doet.


Dat komt in orde
 
- Ariën  -
Beheerder

- Ariën -

25/03/2023 14:50:49
Quote Anchor link
Top!
 
Arno van Zanten

Arno van Zanten

25/03/2023 15:59:26
Quote Anchor link
Maar toch blijft hij dit doen :

Warning: Cannot modify header information

Ik heb echt alles nagekeken en nog blijft deze fout ontstaan
 
- Ariën  -
Beheerder

- Ariën -

25/03/2023 16:10:56
Quote Anchor link
Er staat ook bij vermeld in welk bestand de output staat.
 
Arno van Zanten

Arno van Zanten

25/03/2023 16:29:50
Quote Anchor link
ja in de login.php

Maar ik kan de fout niet zien.
Dit staat in de login.php

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
if($_GET['menu'] == 'login' && $_GET['action'] == 'check' ) {
        $user = $_POST['username'];
        $pass = md5($_POST['password']);
        $key = $_POST['key'];
                
        $sql = "SELECT * FROM AdminUsers WHERE Username='".$user."' AND Passwd='".$pass."' AND LoginKey='".$key."'";
        $result = mysqli_query($connect, $sql);
        $logindetails = mysqli_fetch_all($result, MYSQLI_ASSOC);
        
        foreach($logindetails as $detail) {
            $_SESSION['Name'] = $detail['Name'];
            $_SESSION['Username'] = $detail['Username'];
            $_SESSION['Passwd'] = $detail['Passwd'];
            $_SESSION['Level'] = $detail['Access'];
            $_SESSION['ID'] = $detail['ID'];
        }

        header('location: http://www.[URL].nl/test/index.php');
        exit();
        echo "</div>";
    }
 
Ivo P

Ivo P

25/03/2023 16:40:45
Quote Anchor link
Het leuke van deze foutmelding is dat deze heeeel duidelijk is:

Warning: Cannot modify header information - headers already sent by (output started at /data/sites/web/[site url]/www/test/index.php:6) in /data/sites/web/[site url]/www/test/inc/login.php on line 42

Het is niet mogelijk om de header te sturen, omdat de header al verstuurd is.

Die header is verstuurd toen php begon om output te geven. Dat gebeurde op regel 6 (zegt de foutmelding zelf!)
Daarna staat ter afsluiting ook nog dat dat versturen van de header niet lukte op regel 42.

Er vanuit gaande dat je inderdaad op regel 42 een header moet komen van jou, dan heb je dus een issue op regel 6: waarom komt daar output.

Stel dat dat die melding over "undefined index menu" is, dan los eerst die fout op.
Als daar staat "echo $xyz", dan vraag je af waarom je daar iets op het scherm wilt zetten, als niemand dat ooit te zien krijgt aangezien je op regel 42 "ga door naar locatie X" wilt roepen.
 
Arno van Zanten

Arno van Zanten

25/03/2023 18:40:51
Quote Anchor link
Hier de index, waar zit dan de header hier?
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
        session_start();
                
        include('./inc/dbase.php');

echo '
<html>
    <head>
        <title>Site name</title>
        <link href="inc/login.css" rel="stylesheet" type="text/css" media="screen"/>
    </head>
    <body>
    <!-- Start framework login page -->'
;

        if(!isset($_SESSION['Username'])){
            include("./inc/login.php");
        }
else{
            echo "<br>Welcome User: ";
            echo $_SESSION['Username'];
            echo "<br><a href='./inc/logout.php'>logout</a>";
        }

        
echo '
<!-- End framework login page -->
    </body>
</html>'
;
?>
Gewijzigd op 25/03/2023 18:43:08 door Arno van Zanten
 
- Ariën  -
Beheerder

- Ariën -

25/03/2023 19:27:14
Quote Anchor link
Niet daar.

Warning: Cannot modify header information - headers already sent by (output started at /data/sites/web/[site url]/www/test/index.php:6) in /data/sites/web/[site url]/www/test/inc/login.php on line 42

Op index.php, lijn 6 staat output. En de header staat op login.php op mijn 42.
 
Arno van Zanten

Arno van Zanten

25/03/2023 19:54:22
Quote Anchor link
ja? Moet ik dus een aparte include maken voor een stukje HTML?
 
- Ariën  -
Beheerder

- Ariën -

25/03/2023 20:03:56
Quote Anchor link
Of een logische structuur met if-else. Het is onzinnig om HTML te tonen voordat je iemand doorstuurt.

Ik zorg er altijd voor dat de headers geplaatst worden voordat er HTML gebruikt wordt. Als het niet direct is zijn er altijd wel voorwaarden aan die met if-else kan oplossen.
 
Ivo P

Ivo P

25/03/2023 23:08:47
Quote Anchor link
Een handige benadering is:

1) zet je sessions
2) kijk of er een form gepost is.
2a) zo ja, handel die af.
2b) niet heel ongebruikelijk: na een form post volgt een redirect (GET) naar een/dezelfde url
3) bereid de output voor: verzamel data uit de database, doe berekeningen etc. En bewaar dit in een variabele
4) mogelijk moet nav. stap 3 de gebruiker nog ergens heen geredirect: now is the time
5) begin met je output.
5a) als het niet de standaard html is, dan doe een contentType header (application/json bijv)
5b) begin output: bijvoorbeeld een lap html. In deze html zitten waarschijnlijk plekken waar je iets uit stap 3 wilt tonen: <span>Hallo
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?= $gebruikersnaam; ?>
, welkom op de site</span>
 



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.