Sessie beveiling doet niet wat het moet doen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Arno van Zanten

Arno van Zanten

06/06/2022 12:41:49
Quote Anchor link
Okay ik ben met een soort beveiliging bezig, ik weet er zijn misschien betere manieren, maar dit is voor mensen die niet veel verstand hebben van php.
Ik wil een soort beveiliging inbouwen, maar de output blijft het zelfde

ik wil dit inbouwen

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
<?php

$ID
= $_GET['ID'];
    if($_SESSION['Level'] == '9') {
             echo "je hebt volledige toegang";
        }
else {
            if($_SESSION['ID'] == $ID) {
                 echo " Je hebt beperkte toegang";
            }
else {
                 echo "Je mag niks";
            }

              echo "Totaal geen toegan";
         }

?>

Maar ik krijg elke keer de laatste output.
Terwijl $_SESSION['Level'] en $_SESSION['ID'] wel gezet zijn
Wat doe ik fout?

Toevoeging op 06/06/2022 12:50:35:

PS: het gaat erom dat als een gebruiker ingelogt is en die heeft een sessie level lager dan 9 moet hij alleen dat mogen doen van zijn eigen id.
dat is de bedoeling, want in de adres bar van je brouwser komt de hele link te staan met de id, dus als je de id veranderd, moet hij aangeven dat je daar geen toegang toe hebt.
 
PHP hulp

PHP hulp

15/07/2024 14:06:16
 
Adoptive Solution

Adoptive Solution

06/06/2022 12:55:09
Quote Anchor link
Zet de code netjes onder elkaar en je zult zien dat als je geen level 9 hebt, je nooit toegang hebt.

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
<?php
$ID
= $_GET['ID'];
if( $_SESSION['Level'] == '9' )
{

    echo "je hebt volledige toegang";
}
else {
    if( $_SESSION['ID'] == $ID )
    {

        echo " Je hebt beperkte toegang";
    }
else {
        echo "Je mag niks";
    }

    echo "Totaal geen toegan"; // nog een g op het eind toevoegen
}
?>
 
Arno van Zanten

Arno van Zanten

06/06/2022 12:56:40
Quote Anchor link
Als je goed kijkt, als je geen level 9 hebt moet hij kijken of je wel de sessie id hebt waar je wel toegang toe hebt
 
- Ariën  -
Beheerder

- Ariën -

06/06/2022 12:58:11
Quote Anchor link
Je hebt wel een session_start(); bovenaan in je code staan?
Gewijzigd op 06/06/2022 12:59:41 door - Ariën -
 
Arno van Zanten

Arno van Zanten

06/06/2022 12:59:19
Quote Anchor link
Ja die wordt door de header.php aangeroepen, alles gaat goed, tot ik de $_SESSION['Level'] deed inbouwen

Toevoeging op 06/06/2022 13:02:05:

$_SESSION['ID'] deed hij het wel, maar ik als admin moet tot alles toegang hebben, dus bouwde ik de $_SESSION['Level'] extra erbij in, zodat hij eerst kijkt of de persoon het gewenste level heeft, zoniet kijk of hij wel de juiste id heeft waar hij wel toegang toe heeft.
Zonder $_SESSION['Level'] deed ie het, maar als admin kon ik niet bij andere komen waar ik ook toegang toe moet hebben.
 
- Ariën  -
Beheerder

- Ariën -

06/06/2022 13:02:28
Quote Anchor link
Als je de melding: "Totaal geen toegan(g)" ziet, dan is die level 9 niet in de sessie geplaatst.
De controle $_SESSION['ID'] == $ID is overigens een los statement in je else van je $_SESSION['Level'] == '9' statement.

Persoonlijk zou ik geen levels in een sessie opslaan. Als je iemand level verlaagt, dan blijft die in zijn sessie bestaan tot hij uitlogt. Voor zulke dingen zou ik beter de database gebruiken.
 
Arno van Zanten

Arno van Zanten

06/06/2022 13:03:48
Quote Anchor link
Dat met in en uitloggen weet ik, maar daar ga ik nog een update opmaken, daar is een manier voor om de sessies mee bij te houden live

Toevoeging op 06/06/2022 13:04:45:

- Ariën - op 06/06/2022 13:02:28:
Als je de melding: "Totaal geen toegan(g)" ziet, dan is die level 9 niet in de sessie geplaatst.
De controle $_SESSION['ID'] == $ID is overigens een los statement in je else van je $_SESSION['Level'] == '9' statement.

Persoonlijk zou ik geen levels in een sessie opslaan. Als je iemand level verlaagt, dan blijft die in zijn sessie bestaan tot hij uitlogt. Voor zulke dingen zou ik beter de database gebruiken.

PS: sessie level is wel in de sessie mee opgenomen





Toevoeging op 06/06/2022 13:05:48:

Bij een andere pagina gebruik ik hem ook en daar werkt het wel

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
                if($_SESSION['Level'] == '9') {
                    echo "<td colspan='4' align='right'><a href='index.php?menu=editprofile&ID=".$info['ID']."'>Edit</a></td>";
                }
else {
                    
                    if($_SESSION['Name'] == $info['Name']) {
                        echo "<td colspan='4' align='right'>You can <a href='index.php?menu=editprofile&ID=".$info['ID']."'>Edit</a> your profile</td>";
                        }
else {
                            echo "<td colspan='4' align='right'>You cannot edit this profile</td>";        
                        }
                }

?>
 
- Ariën  -
Beheerder

- Ariën -

06/06/2022 13:12:50
Quote Anchor link
Ik snap niet waarom je een $_GET['id'] gebruikt voor een inlogsysteem?

Tipje: Je kan je code ook netter maken door het script in je een <td> te plaatsen.
Dat scheelt weer een hoop herhalen van de zelfde opmaak.
 
Arno van Zanten

Arno van Zanten

06/06/2022 13:15:03
Quote Anchor link
Maar daar gaat het nu niet om, waarom werkt de code bij een andere page wel en bij de andere niet?
 
- Ariën  -
Beheerder

- Ariën -

06/06/2022 13:15:56
Quote Anchor link
Misschien omdat session_start() mist?
Sessie niet aangemaakt?
Gewijzigd op 06/06/2022 13:16:18 door - Ariën -
 
Arno van Zanten

Arno van Zanten

06/06/2022 13:16:42
Quote Anchor link
zoasl ik al zie, die wordt door de header aangeroepen, dus dat is niet het probleem
 
- Ariën  -
Beheerder

- Ariën -

06/06/2022 13:18:40
Quote Anchor link
Dan is de sessie niet aangemaakt.
Check eens of de sessie bestaat:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo "<pre>".print_r($_SESSION,true)."</pre>";
?>
Gewijzigd op 06/06/2022 13:18:51 door - Ariën -
 
Arno van Zanten

Arno van Zanten

06/06/2022 13:18:47
Quote Anchor link
Log ik in als Admin, dan kan ik alles gewoon doen, log ik in als een user, dan kan ik niks
 
- Ariën  -
Beheerder

- Ariën -

06/06/2022 13:19:44
Quote Anchor link
Check je sessie-array dus eens ^
Dit kan je eenvoudig uitzoeken door simpel debugwerk.
 
Arno van Zanten

Arno van Zanten

06/06/2022 13:19:50
Quote Anchor link
De sessie bestaat, ik zeg net dat de sessie aangemaakt wordt in de header.
Als admin kan ik wel gewoon alles doen op de page, maar als user niks
 
- Ariën  -
Beheerder

- Ariën -

06/06/2022 13:21:50
Quote Anchor link
Dan zal $info['Name'] niet bestaan of overeenkomen.
Gewijzigd op 06/06/2022 13:22:44 door - Ariën -
 
Arno van Zanten

Arno van Zanten

06/06/2022 13:25:32
Quote Anchor link
deze werkt

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
                if($_SESSION['Level'] == '9') {
                    echo "<td colspan='4' align='right'><a href='index.php?menu=editprofile&ID=".$info['ID']."'>Edit</a></td>";
                }
else {
                    
                    if($_SESSION['Name'] == $info['Name']) {
                        echo "<td colspan='4' align='right'>You can <a href='index.php?menu=editprofile&ID=".$info['ID']."'>Edit</a> your profile</td>";
                        }
else {
                            echo "<td colspan='4' align='right'>You cannot edit this profile</td>";        
                        }
                }

?>


deze niet
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
<?php

$ID
= $_GET['ID'];
    if($_SESSION['Level'] == '9') {
             echo "je hebt volledige toegang";
        }
else {
            if($_SESSION['ID'] == $ID) {
                 echo " Je hebt beperkte toegang";
            }
else {
                 echo "Je mag niks";
            }

              echo "Totaal geen toegan";
         }

?>

en om deze gaat het
 
- Ariën  -
Beheerder

- Ariën -

06/06/2022 13:31:25
Quote Anchor link
Het verschil tussen beide in de praktijk is dat de bovenste de naam op lijn 6 uit een array haalt (vermoedelijk een database).

En in het tweede komt dit uit $ID, wat eerder uit een $_GET blijkt te komen.

Verder klopt de statement van je laatste code niet. "Totaal geen toegang" is geen opzichzelfstaande statement. Die wordt ALTIJD uitgevoerd bij je else. Dus als Level geen 9 is, dan krijg je te zien: 'Totaal geen toegan(g)'
 
Arno van Zanten

Arno van Zanten

06/06/2022 13:34:48
Quote Anchor link
Het gaat niet om de statment niet om $_GET, de zelfde manier van beveiliging werkt in de ene page wel en in de andere niet.
Het gaat er niet om of de session_start() wel of niet geladen wordt, die wordt in de header geladen.
Alles staat in de sessie.
Echter werkt de zelfde opbouw in de ene pagina wel, alleen in de andere niet.
log ik in als user, dan mag ik totaal niks aanpassen, ook niet waar ik toegang zou moeten hebben, log ik als admin in, kan overal bij
 
- Ariën  -
Beheerder

- Ariën -

06/06/2022 13:39:17
Quote Anchor link
Ik zie praktisch gezien wel een verschil in beide scripts, die ik net heb uitgelegd.

Maar toch vraag ik mij af: Waarom gebruik je $_GET in een inlogsysteem? Dat is hetzelfde als de sleutel buiten in het slot steken als je weggaat?
 
Arno van Zanten

Arno van Zanten

06/06/2022 13:44:10
Quote Anchor link
Het is geen inlog systeem waar de code instaat.
Hier de broncode in totaal waar het wel werkt.

info.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
<?php
        $sql
= 'SELECT * FROM Info ORDER BY ID DESC';
        $result = mysqli_query($connect, $sql);
        $details = mysqli_fetch_all($result, MYSQLI_ASSOC);
        mysqli_free_result($result);
        mysqli_close($connect);
    echo"
        <tr>
            <td colspan='7'>"
;
        
        foreach($details as $info) {
            
        echo"    <center>
                <table width='800' cellspacing='2px'>
                    <tr><td>Photo</td>
                    <td colspan='2'>Info</td>
                    <td>Personal Info</td></tr>
                    <tr rowspan='4'>
                        <td width=100><img src='./img/profile/"
.$info['Name']."'.jpg width='160'></td>
                        <td align='left' style='vertical-align:top' width='100px'>Name :<br>Function :<br>Phone :<br>E-mail :<br></td>
                        
                        <td align='left' style='vertical-align:top' width='200px'>"
.$info['Name']."<br>".$info['Function']."<br>+31".$info['Phone']."<br>".$info['Email']."<br></td>
                    
                        <td td align='left' style='vertical-align:top' colspan='5' width='300px'>"
.nl2br($info['PersonalInfo'],false)."</td>
                    </tr>
                    <tr>"
;
                if($_SESSION['Level'] == '9') {
                    echo "<td colspan='4' align='right'><a href='index.php?menu=editprofile&ID=".$info['ID']."'>Edit</a></td>";
                }
else {
                    
                    if($_SESSION['Name'] == $info['Name']) {
                        echo "<td colspan='4' align='right'>You can <a href='index.php?menu=editprofile&ID=".$info['ID']."'>Edit</a> your profile</td>";
                        }
else {
                            echo "<td colspan='4' align='right'>You cannot edit this profile</td>";        
                        }
                }

                        echo "
                    </tr>
                </table>
                </center>
                <p>"
;
        }
        
    echo"
            </td>
        </tr>
    
    "
;
?>

En hier de code waar het niet werkt, maar wel de zelfde opbouw
editprofile.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
<?php
    
    $ID
= $_GET['ID'];
    if($_SESSION['Level'] == '9') {
        
        $sql = 'SELECT * FROM Info WHERE ID="'.$ID.'"';
        $result = mysqli_query($connect, $sql);
        $info = mysqli_fetch_all($result, MYSQLI_ASSOC);
        mysqli_free_result($result);
        mysqli_close($connect);
            foreach($info as $details) {
                    $name = $details['Name'];
                    $function = $details['Function'];
                    $phone = $details['Phone'];
                    $email = $details['Email'];
                    $info = $details['PersonalInfo'];
                    $id = $details['ID'];
            }

            echo "<center>
                <form action='./inc/replaceinfo.php' method='post'>
                <input type='text' name='name' value='"
.$name."' placeholder='".$name."'><br>
                <input type='text' name='function' value='"
.$function."' placeholder='".$function."'><br>
                <input type='text' name='phone' value='"
.$phone."' placeholder='".$phone."'><br>
                <input type='text' name='email' value='"
.$email."' placeholder='".$email."'><br>
                <textarea name='info' rows='25' cols='90'>"
.$info."</textarea><br>
                <input type='hidden' name='ID' value='"
.$id."' size='92' placeholder='".$id."'><br>
                <button type='submit' name='submit'>Edit profile</button><br>
            </form>
            </center>"
;

        }
else {

            if($_SESSION['ID'] == $ID) {
            
                $sql = 'SELECT * FROM Info WHERE ID="'.$ID.'"';
                $result = mysqli_query($connect, $sql);
                $info = mysqli_fetch_all($result, MYSQLI_ASSOC);
                mysqli_free_result($result);
                mysqli_close($connect);
                    foreach($info as $details) {
                            $name = $details['Name'];
                            $function = $details['Function'];
                            $phone = $details['Phone'];
                            $email = $details['Email'];
                            $info = $details['PersonalInfo'];
                            $id = $details['ID'];
                    }

                    echo "<center>
                        <form action='./inc/replaceinfo.php' method='post'>
                        <input type='text' name='name' value='"
.$name."' placeholder='".$name."'><br>
                        <input type='text' name='function' value='"
.$function."' placeholder='".$function."'><br>
                        <input type='text' name='phone' value='"
.$phone."' placeholder='".$phone."'><br>
                        <input type='text' name='email' value='"
.$email."' placeholder='".$email."'><br>
                        <textarea name='info' rows='25' cols='90'>"
.$info."</textarea><br>
                        <input type='hidden' name='ID' value='"
.$id."' size='92' placeholder='".$id."'><br>
                        <button type='submit' name='submit'>Edit profile</button><br>
                    </form>
                    </center>"
;
            }
else {
                echo "<center><table><tr><td colspan='7' align='center'><h3>Not allowed</h3></td></tr></table></center>";
            }
        }

?>

En nu niet zeuren over de $_GET of session_start(), die wordt in de header geladen.
Deze pages worden door een include aangeroepen.
Zelfde opbouw alleen ander variablen, maar de info.php werkt en bij editprofile.php niet.
En mijn vraag is, waarom?
Laat ik $_SESSION['Level'] in editprofile weg, dan werkt het, doe ik die erbij, dan werkt het niet.
Als admin werkt het wel, want ik heb level 9, maar als user niet ik heb dan level 7 maar wel de id waar ik toegang toe moet hebben, maar ook dan mag ik niks.
 

Pagina: 1 2 volgende »



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.