Extra beveiliging na inloggen.

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 »

Izildo Pimentel

Izildo Pimentel

07/06/2018 09:03:19
Quote Anchor link
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
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
<?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;
}
[
/code]

[
code]
[
code]<?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");
    }

?>

Gewijzigd op 07/06/2018 09:54:30 door Izildo Pimentel
 
PHP hulp

PHP hulp

23/12/2024 07:35:33
 
Ben van Velzen

Ben van Velzen

07/06/2018 09:34:49
Quote Anchor link
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.
 
Izildo Pimentel

Izildo Pimentel

07/06/2018 09:49:45
Quote Anchor link
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?
 
Martijn Wieringa

Martijn Wieringa

07/06/2018 10:11:24
Quote Anchor link
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$query = "SELECT * FROM Registratie WHERE Email = '$email' AND Wachtwoord = '$wachtwoord'";


Wordt dan:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$query = "SELECT * FROM Registratie WHERE Email = '" . mysqli_real_escape_string($conn, $email) . "' AND Wachtwoord = '" . mysqli_real_escape_string($conn, $wachtwoord) . "'";
Gewijzigd op 07/06/2018 10:20:40 door Martijn Wieringa
 
- Ariën  -
Beheerder

- Ariën -

07/06/2018 10:13:48
 
Ben van Velzen

Ben van Velzen

07/06/2018 10:13:53
Quote Anchor link
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.
 
- Ariën  -
Beheerder

- Ariën -

07/06/2018 10:15:37
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT * FROM gebruikers WHERE plaatsnaam= ''s-Gravenshage'


of als iemand kwade intenties heeft:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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.
Gewijzigd op 07/06/2018 12:03:15 door - Ariën -
 
Izildo Pimentel

Izildo Pimentel

07/06/2018 22:58:36
Quote Anchor link
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.

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
<?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;
}

?>
 
Thomas van den Heuvel

Thomas van den Heuvel

07/06/2018 23:07:29
Quote Anchor link
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.
 
Ben van Velzen

Ben van Velzen

07/06/2018 23:21:06
Quote Anchor link
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.
 
Izildo Pimentel

Izildo Pimentel

07/06/2018 23:48:58
Quote Anchor link
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.
 
Thomas van den Heuvel

Thomas van den Heuvel

08/06/2018 00:05:29
Quote Anchor link
Het kost helemaal niet veel moeite om iets veilig te maken.

Ik denk ook dat je veel meer leert van beveiligingsprincipes dan het simpelweg volgen van een apetruuk.

Achter wat je implementeert zou in ieder geval een motivatie moeten zitten, in elke regel code zitten in wezen ontwerpbeslissingen. Als je iets op manier A doet, dan doe je dit niet op manier B. Waarom (niet)? Als je onderbouwing niet verder reikt dan "dit werkt" dan zou ik dat als docent niet accepteren.

Hell, als het werkelijk zo weinig uit zou maken als jij doet voorkomen was het makkelijker geweest om ergens een loginscript van de interwebs te copypasten (vol met exploits en baggercode). Dat zou dan wel een mistroostig beeld schetsen van de kwaliteit van het hedendaags (IT-)onderwijs.

En wat is dat trouwens met dat onderwijs tegenwoordig, onderwijzen ze daar niet over debugging? Dat lijkt mij bij uitstek een geschikte manier om te leren programmeren.

Dit helpt ook veel meer bij het oplossen van probleem omdat dit je dwingt om je eigen code en foutmeldingen te interpreteren. Iedereen is zo snel van het padje af als er ergens een typefout gemaakt wordt of wanneer er iets onverwachts gebeurt wat men niet kan verklaren... dat houdt eigenlijk in dat je niet weet waar je mee bezig bent. Veel "problemen" hier zijn dan ook niet het probleem, het daadwerkelijke probleem is vaak dat men geen idee heeft hoe ze het probleem zouden moeten aanpakken.
Gewijzigd op 08/06/2018 00:11:52 door Thomas van den Heuvel
 
- Ariën  -
Beheerder

- Ariën -

08/06/2018 00:47:34
Quote Anchor link
Izildo Pimentel op 07/06/2018 23:48:58:
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.

Totdat 's-Hertogenbosch wordt ingevuld: Error!
Minpuntje op de lijst!
Quote:
Maak je maar geen zorgen dit is niet een realistische omgeving.

Zorg liever dat je alles goed voor elkaar hebt. Daar wordt de beoordelaar bij een controle ook vrolijk van, en het laat tevens zien dat je zelf ook ervaring hebt opgedaan voor het schrijven van een veilig systeem. En in deze tijd zal iedereen dat toejuichen.

Wat de klant aan eisen zal opstellen, betekent niet dat je expliciet aan die eisenlijst moet houden. De klant heeft geen ervaring met veiligheid en eist een inlogsysteem. Jij weet beter en jij gaat dan ook toevoegen wat jij een MUST HAVE vindt: De veiligheid!

Zie ook deze blog over een 'functioneel ontwerp'.
 



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.