Goedemorgen U allen,

Ik probeer voor mijn eenvoudige website die alleen voor privé doeleinde wordt gebruikt, een menu te maken dat kijkt wie er is ingelogd.
Het inloggen gaat prima nu wil ik een 2 tal menu links voor de gebruiker niet zichtbaar maken.

Gebruiker

home
dashboard
logboek



Beheerder

home
dashboard
logboek
service

Waar ik na laat kijken is


<?php
if (isset($_POST['submit']))
{
    $UserName=$_POST['UserName'];
    $Password=$_POST['Password'];
    
    if ($UserName=="user1" && $Password=="pw1")
        
    {
        session_start();
        $_SESSION['member']="User1";
        header('location:service.php');
    }
    elseif ($UserName=="user2" && $Password=="pw2")
    {
        session_start();
        $_SESSION['member']="User2";
        header('location:settings.php');
    }
    else
    {
        header("location:index.php?error=1");
    }
}
?>


En dit doe ik om te kijken of de menu link zichtbaar mag worden.

<?php
$UserName = "user2"; 
 
if ($UserName == "user2"):?>
    <p><a href="service.php">Service</a></p>
<?php else:   
    echo "  ";
 endif; ?>



Nu weet ik dat mijn kennis van PHP niet erg groot is maar ik kom met mijn kennis een heel eind voor mijn website.
Helaas is dit voor mij een struikelblok waar ik niet uit kom ik heb het idee dat ik er heel dicht bij ben maar ik zie niet.
Dus klop ik hier maar weer even aan om raad te vragen.

Ps. ik weet dat mijn kennis van PHP niet zo is als die van de meeste hier.
Ook voor thuis gebruik kan je prima een database gebruiken. En dat het niet aan het internet hangt staat er ook los van.

Het maakt het flexibeler. Want wat nu als één van je gebruikers zijn wachtwoord vergeten is, en geen toegang tot je code heeft?
Wederom, header('Location: ...'); transporteert je niet direct automagisch naar de nieuwe locatie, dit gebeurt pas aan het einde van het script omdat headers onderdeel van output zijn.

Beschouw het volgende stuk code:
<?php
if (isset($_SESSION['member']) === false) {
    header('Location: elsewhere.php');
}
// gevoelige code die gegevens kan manipuleren
// ...
?>

Aanname: $_SESSION['member'] bestaat niet.
Dit is wat er dan achtereenvolgens gebeurt bij aanroep van dit script:
1. de Location header wordt ingesteld op "elsewhere.php"
[color=#ff0000]2. de code in het onderdeel "// gevoelige code die gegevens kan manipuleren" WORDT UITGEVOERD[/color]
3. na afloop van het script word je direct doorgestuurd naar "elsewhere.php"

Bijna altijd is het bij dit soort constructies de bedoeling dat je DIRECT (en niet na afloop) wordt doorgestuurd wanneer niet aan de condities is voldaan. De rest van het script mag dan simpelweg niet uitgevoerd worden. Dit kun je bereiken door direct na de header('Location: ...') aanroep een exit-statement te zetten. De rest van de uitvoer(ing) van het script wordt dan direct gestaakt.

Omdat je dan ook (heel) vaak eigenlijk hetzelfde doet, loont het misschien de moeite om hier een functie (of methode) voor te introduceren, zodat je het toevoegen van exit ook nooit meer vergeet:
<?php
function redirect($link) {
    header('HTTP/1.1 303 See Other');
    header('Location: '.$link);
    exit; // opdat we dit NOOIT meer vergeten
}
?>

Prent het volgende goed in je gedachten: het aanwezig zijn of ontbreken van een exit-statement in code kan het verschil betekenen tussen beveiligde of (onbedoeld) onbeveiligde operaties.
Thomas van den Heuvel,

Dank je ik ga dit ook inbouwen.

Reageren