Ik heb een extra regel toegevoegd bij mijn index pagina, om te check als naam and wachtwoord niet overkomen die met de sessie doorgevoerd zijn ga dan terug. Als het goed is zijn mijn inlog gegevens gewoon goed, maar de index stuurt mij als nog terug naar mijn inlogform.

Hier zie je mijn inlog.php waar ik gegevens check van de database

<?php

ini_set('display_errors', 'On');
error_reporting(E_ALL);

// lees het config-bestand
require_once 'config.php';

// lees alle formulierenvelden
$email = $_POST['Email'];
$wachtwoord= $_POST['Wachtwoord'];

// controleer of alle formuliervelden waren ingevuld
if (strlen($email) > 0 && strlen($wachtwoord) > 0) {
    // versleutel het wachtwoord
    $wachtwoord = md5($wachtwoord);

    // maak de controle-query
    $query = "SELECT * FROM Registratie WHERE Email = '$email' AND Wachtwoord = '$wachtwoord'";

    // voer de query uit
    $result = mysqli_query($conn, $query);

    // controleer of de login correct was
    if ($mysqli_num_rows['$result'] == 1){
        // login correct, start de sessie
        session_start();

        // sla de username op in de sessie
        $_SESSION['Email'] = $email;
        $_SESSION['Wachtwoord'] = $wachtwoord;

        // stuur door naar de homepage
        header("Location:index.php");

    } else {

      // login incorrect, terug naar het login-formulier
        header("Location: inlogform.php");
        exit;
    }
} else {
    echo "Niet alle velden zijn ingevuld!";
    exit;
}



<?php

    // Aantal lijnen voor het debuggen
    error_reporting(E_ALL);
    ini_set('display_errors', '1');

    // Start sessie
    session_start();

    // Extra check voor zekerheid van inlog
    if(isset($_SESSION['Email']) && $_SESSION['Wachtwoord'])
    {
        echo "Welcome";

    } else {
        header("Location: inlogform.php");
    }
?>
Waarom zou je een wachtwoord in de sessie opslaan? Oh nee, dat doe je ook helemaal niet, maar je controleert er wel op. Dat zal je fout wel oplossen.

En nu de serieuzere problemen:
1. Waar is de escaping in je query? Als je de inhoud van je database op straat wil gooien moet je vooral zo doorgaan.
2. Waarom gebruik je md5()? Dat is vandaag de dag echt niet veilig genoeg meer. Gebruik password_hash() icm password_verify().
3. Waarom zou je meer opslaan in de sessie dan een ID? Een emailadres is al overbodig, die staat al in de database.
4. Waar staat de controle in de code of de geposte waarden bestaan?
5. Doorwerkend op punt 4: waarom maak je een kopie van variabelen? Zie regels 7 en 8 van inlog.php

Ik kan vast nog wel even zo doorgaan, maar het punt is hopelijk duidelijk.
1 en 2 is iets voor later voor nu probeer ik echt ervoor te zorgen dat je kan inloggen.
3. Ik zie dat iedereen het zo doet, checken op username and wachtwoord, dan moet ik die ook wel meegeven toch.
Als ik wil checken op id moet ik die ook meegeven in de query?
Nog een tip, MD5 om wachtwoorden te encrypten wordt tegenwoordig niet meer gezien als veilig genoeg.
Daarom heeft PHP daarom de hash() functie in het leven geroepen die nog veel meer methoden ondersteund.

hash('sha512', $myPassword);


Zie: http://php.net/manual/en/function.hash.php



Nog 1 ander dingetje, je SQL commando is gevoelig voor SQL-injectie. Ik adviseer je de gebruikersinput in je query netjes te escape'en.

$query = "SELECT * FROM Registratie WHERE Email = '$email' AND Wachtwoord = '$wachtwoord'";


Wordt dan:

$query = "SELECT * FROM Registratie WHERE Email = '" . mysqli_real_escape_string($conn, $email) . "' AND Wachtwoord = '" . mysqli_real_escape_string($conn, $wachtwoord) . "'";



Vooral 1 bewaren voor later is vragen om problemen. Je vergeet gegarandeerd iets. Dit zijn dingen die je altijd meeneemt in het ontwerp. Voor punt 2: ook beter om eerder te veranderen dan later, je kunt immers hashfuncties niet omdraaien, waardoor je bestaande wachtwoorden niet opnieuw kan invoeren.
Voor punt 3 geldt: ja, je controleert op gebruikersnaam en wachtwoord. Bij het inloggen. Verder is dat niet noodzakelijk.
En wat is $mysqli_num_rows voor variabele :p ?

Ik heb sterk het idee dat je meer code aan het gokken bent, dan dat je echt weet wat je aan het doen bent.

Lees dus daarom de functiebeschrijvingen op php.net.

En zelf raad ik ook aan om stap 1 en 2 direct aan te passen in je code, en niet er mee te wachten tot later.

En om nog een misstand uit de wereld te helpen: Velen denken dat SQL-injection namelijk enkel een beschermmiddel is tegen hacken, maar dat is het niet alleen.

Het beschermt je ook tegen speciale tekens die je query kunnen stuk maken. Denk bijvoorbeeld aan de single-quote.

Vul maar eens voor de grap 's-Gravenshage in in een onbeveiligde query. Grote kans dat deze query niet uitgevoerd zal worden. Op dezezelfde manier wordt het hacken dus ook mogelijk gemaakt, door extra gegevens aan de query toe te voegen, zodat deze meer dan dan dat de ontwikkelaar verwacht.

Regelmatig hoor ik ook wel eens van mensen dat beveiliging tegen SQL-injection onnodig is omdat ze toch een een afgeschermde omgeving werken, maar dat zijn flauwekul-argumenten. Je moet de invoerdata van je query ALTIJD escapen. Je wilt niet dat deze stuk loopt op bijvoorbeeld deze query:

SELECT * FROM gebruikers WHERE plaatsnaam= ''s-Gravenshage'


of als iemand kwade intenties heeft:

 SELECT * FROM gebruikers WHERE inlognaam= 'Pieterssen' OR 'a' = 'a'

Doordat de laatste OR-voorwaarde altijd waar is, is het dus eenvoudig om als Pieterssen in te loggen.

Tot zo ver een stukje uitleg over SQL-injection en de gevaren ervan.
Weet niet altijd wat er gaande speelt maarja denk dat hoort bij het leerprocess. heb uiteindelijk mijn inloggen kunnen fixen. De probleem zat er denk ik in dat ik die md5 gebruikte waardoor mijn wachtwoord er anders uit kwam te zien.

Ik weet dat ik nog die injectie erbij moet zetten voor die query, en nog een encreptie voor password, maar alleen om te laten zien hoe mij code nu is.



<?php

ini_set('display_errors', 'On');
error_reporting(E_ALL);
session_start();

//Maak database verbinding
require_once 'config.php';

//Lees inlog gegevens
$email = $_POST['Email'];
$wachtwoord = $_POST['Wachtwoord'];

//Controleer of alle velden waren ingevuld
if(strlen($email) > 0 && strlen($wachtwoord) > 0) {
    //Versleutel wachtwoord
    //$wachtwoord = md5($wachtwoord);

    //Controle-query
    $query = "SELECT * FROM Registratie WHERE Email = '$email' AND Wachtwoord = '$wachtwoord'";

    //Voer de query uit
    $result = mysqli_query($conn, $query);

    //Haal accounttype op
    $row = mysqli_fetch_array($result);
    $email = $row['Email'];
    $ID = $row['ID'];


    //Controleer of de login correct was
    if (mysqli_num_rows($result) == 1) {
        //Login correct, start sessie
        session_start();

        //Sla de mail en accounttype op in de sessie
        $_SESSION['Email'] = $email;
        $_SESSION['Wachtwoord'] = $wachtwoord;
        $_SESSION['ID'] = $ID;

        header("Location: homepage.php");

    }else{
        //Login fout, terug naar login pagina
        header("Location: index.php");
    }
}else{
    echo "Niet alle velden zijn ingevuld";
    exit;
}
?>
Lees de voorgaande reacties over SQL-injectie nogmaals.

Daarnaast transporteert header('Location: ...') je niet direct automagisch naar de nieuwe locatie, daarom dient dit statement bijna altijd gevolgd te worden door een exit; statement zoals hier (interne link) staat uitgelegd.
Zet foutafhandeling een aan en log eens in met een foute gebruikersnaam/wachtwoord. Je gooit al data in andere variabelen voordat je weet of er records zijn. Het "werkt" ja, maar zal een hoop foutmeldingen gooien.
En de hashing helemaal weghalen? Ik mag hopen dat dit nooit in productie komt te staan, want je vraagt om claims op deze manier.
Die sql injectie en exit heb ik nu ook bij gezet. Ik snap het er zijn meerdere checks voor security, maarja school wil zien dat je kan inloggen.

Maak je maar geen zorgen dit is niet een realistische omgeving.

Reageren