• Hallo, ik wil graag dat de gebruiker met een uniek id zijn/haar eigen gegevens kan wijzigen. Daarvoor heb ik deze query gebruikt maar ik krijg er niks van uit. Wie zou mij kunnen helpen?


    Code
    $query = "SELECT inlog.gebruiker,registreren.* FROM inlog, registreren WHERE inlog.user_id = '".$_SESSION['gebruiker']."' AND '".$_GET['registreren.user_id']."' = '".$_GET['inlog.id']."'";


    database voor de adressen

    database van het inloggen


    Alvast dank voor de moeite

  • Code
    $query = "SELECT inlog.gebruiker,registreren.* FROM inlog
    JOIN registreren ON(inlog.user_id=registreren.user_id) WHERE inlog.user_id = '".$_SESSION['gebruiker']."';

    Hiermee haal je gewoon de gegevens van de user op die je nodig hebt.


    Jouw manier gaat niet werken omdat je registreren en inlog moet indentificeren dat ze over dezelfde gebruiker gaan en wat dus de koppelId is. Dat doe je niet door values maar door tabelnamen. Zoals te zien is in de join ON()

  • Code
    $query = "SELECT inlog.gebruiker,registreren.* FROM inlog
    JOIN registreren ON(inlog.user_id=registreren.user_id) WHERE inlog.user_id = '".$_SESSION['gebruiker']."';

    Hiermee haal je gewoon de gegevens van de user op die je nodig hebt.


    Jouw manier gaat niet werken omdat je registreren en inlog moet indentificeren dat ze over dezelfde gebruiker gaan en wat dus de koppelId is. Dat doe je niet door values maar door tabelnamen. Zoals te zien is in de join ON()

    Het werkt nog steeds niet, hij selecteerd nog steeds alle gegevens van andere gebruikers.

  • - welke waarde zit er in $_SESSION['gebruiker']?
    - start je je sessie / zet je je sessie voort met session_start() voordat je $_SESSION gebruikt?
    - hoeveel resultaten levert deze query op en kloppen deze resultaten?

    Ten eerste heb ik wel een session_start(); gebruikt om met sessie aan de gang te gaan, ten tweede de waarde die hij in $_SESSION['gebruiker'] invoert is de user_id tog en daardoor levert hij 3x hetzelfde adressen per id op. Maar ik moet 1 uniek adres op 1 uniek gebruiker hebben

    Code
    session_start(); 
    // als de gebruikersnaam en wachtwoord leeg zijn
    if(empty($_POST['username']) && empty($_POST['password']))
    {
    	
    }


  • Security dingetje: waarom komt $password vandaan in je $sql string? Escape je deze ook of komt deze rechtstreeks uit $_POST? In het laatste geval is je query mogelijk vatbaar voor SQL-injectie.


    Dan stop je een heleboel informatie in je sessie. Dat is helemaal niet nodig en ook onhandig. Stel dat je iemand (anders) een admin maakt - dan zou deze persoon opnieuw in moeten loggen? Deze informatie is immers niet bijgewerkt in zijn/haar sessie. Ook als je iemand het admin-recht ontneemt, gaat dit pas in als deze persoon opnieuw inlogt. Kortom: dit soort data in je sessie veroudert snel en loopt dan niet meer gelijk met de data in je database.


    Het is gewoon in meerdere opzichten beter en verstandiger om elke page-access deze gegevens opnieuw te "berekenen" aan de hand van het user-id in de sessie (het enige veld wat relevant is om te onthouden qua gebruikers-informatie). Deze informatie sla je bijvoorbeeld op in een user-object wat overal in je code beschikbaar is. Na een page-refresh wordt dit user-object opnieuw opgebouwd met actuele informatie uit je database.

  • Security dingetje: waarom komt $password vandaan in je $sql string? Escape je deze ook of komt deze rechtstreeks uit $_POST? In het laatste geval is je query mogelijk vatbaar voor SQL-injectie.


    Dan stop je een heleboel informatie in je sessie. Dat is helemaal niet nodig en ook onhandig. Stel dat je iemand (anders) een admin maakt - dan zou deze persoon opnieuw in moeten loggen? Deze informatie is immers niet bijgewerkt in zijn/haar sessie. Ook als je iemand het admin-recht ontneemt, gaat dit pas in als deze persoon opnieuw inlogt. Kortom: dit soort data in je sessie veroudert snel en loopt dan niet meer gelijk met de data in je database.


    Het is gewoon in meerdere opzichten beter en verstandiger om elke page-access deze gegevens opnieuw te "berekenen" aan de hand van het user-id in de sessie (het enige veld wat relevant is om te onthouden qua gebruikers-informatie). Deze informatie sla je bijvoorbeeld op in een user-object wat overal in je code beschikbaar is. Na een page-refresh wordt dit user-object opnieuw opgebouwd met actuele informatie uit je database.

    Ik zou het allemaal niet weten eerlijk gezegd, ben pas een eerste jaar applicatieontwikkelaar en zou echt niet weten hoe ik die password gedoe moet beveiligen etc maar het komt gelijk uit mijn $_SESSIE. Is het mogelijk dat jij naar mijn codes zou kunnen kijken in verband met het SQL-injectie of iets dergelijks?

  • Uit een eerder fragment van jou:

    PHP
    $sql = "SELECT username, password, admin, gebruiker FROM inlog WHERE username='$username' AND password='$password'";
     $query = mysqli_query($conn, $sql);
    
    
    // etc.

    Waar komen in dit geval $username en $password vandaan en hoe zien deze er uit?


    Een systeem kan simpel zijn en nog steeds veilig, hier hoef je niet veel voor te doen maar je moet de onderliggende principes wel een beetje begrijpen.


    Ik kan wel toelichting geven op je code maar ik kan je niet in 2 zinnen overdragen wat belangrijk is. Dat is toch meer leren door het te doen. Een vuistregel die je wel altijd kunt hanteren of in je achterhoofd zou moeten houden is de volgende:


    filter input, escape output


    filter input houdt in: controleer je invoer - dit kan van alles zijn (formulier, URL variabelen etc.). Als je verwacht dat bepaalde invoer een bepaalde vorm moet hebben, controleer hier dan op. Bijvoorbeeld: als je verwacht dat $_GET['id'] een getal bevat, controleer dit!


    escape output betekent: ontdoe data (waar nodig) binnen een bepaalde context van haar speciale betekenis. Bijvoorbeeld: de karakters < en > in de tekst '<b>dikgedrukt</b>' hebben in de HTML-context eem speciale betekenis: deze duiden (mogelijk) de begrenzingen aan van HTML tags. Om deze karakters binnen HTML van hun speciale betekenis te ontdoen zijn hier escape-functies voor zoals htmlentities() en htmlspecialchars().


    Zo zijn er ook escape-functies voor andere contexten, zoals de _real_escape_string() functies voor MySQLi om de DATA delen in je SQL van mogelijk speciale betekenis te ontdoen.


    Dat is namelijk precies wat een SQL-injectie is: je voegt een stuk tekst (DATA) in in je query die vervolgens als SQL geinterpreteerd wordt terwijl dit eigenlijk enkel als DATA gebruikt mocht worden. Met een SQL-injectie wordt meestal de werking van de query gemanipuleerd zodat deze een andere betekenis krijgt / iets anders doet dan eigenlijk de bedoeling.

  • Hmm dankjewel voor je uitleg, ik zou er mee aan de gang proberen te gaan!

  • Voor het veilig maken van je wachtwoord zou ik ook eens kijken naar hasing:
    http://php.net/manual/en/function.hash.php


    Anders is een rainbow table zo gemaakt of over je database heen gehaald. Sowieso wordt er al afgeraden om een MD5 HASH alleen te gebruiken. En meer richting blowfish hash / algoritme te gaan. i.c.m. een unieke hash per gebruiker wordt het vrij lastig om dan nog te bruteforce hacken.


    Ik zelf gebruik tegenwoordig SHA512 om mijn wachtwoorden op te slaan i.c.m. een random gegenereerde hash string website breed die elk half uur vernieuwd wordt. (Toevoeging op het wachtwoord wat eigenlijk voor elk wachtwoord het zelfde is alleen die er wel bij moet zitten bij het inloggen omdat anders het wachtwoord sowieso fout is).


    Daarnaast zoals Luc al in zijn query laat zien in plaats twee tabellen in je SELECT statement te hebben altijd een JOIN gebruiken wil je een goede query schrijven. Met joins heeft onderstaande afbeelding me veel geholpen om er goed uit te komen wanneer welke JOIN gebruikt moet worden:


Participate now!

Heb je nog geen account? Registreer je nu en word deel van onze community!