• Inloggen
  • Registreer
  • Zoeken
Dit topic
  • Overal
  • Dit topic
  • Dit forum
  • Artikelen
  • Pagina's
  • Forum
  • Downloads
  • Meer opties

ICTscripters

Dé plek voor IT

Dé plek voor IT

Aanmelden

Geavanceerde opties
  1. Home
  2. Forum
    1. Alle berichten
    2. Recente activiteiten
    3. Onopgeloste topics
  3. ICT Nieuws
  4. Blog
  5. Marktplaats
    1. Werk
    2. Advertenties
    3. Domeinnamen
    4. Websites
    5. Design & lay-outs
    6. Scripts
    7. Overige
  6. Design
  7. Leden
    1. Actieve bezoekers
    2. Team
    3. Leden zoeken
  8. Downloads
  1. Home
  2. Forum
    1. Alle berichten
    2. Recente activiteiten
    3. Onopgeloste topics
  3. ICT Nieuws
  4. Blog
  5. Marktplaats
    1. Werk
    2. Advertenties
    3. Domeinnamen
    4. Websites
    5. Design & lay-outs
    6. Scripts
    7. Overige
  6. Design
  7. Leden
    1. Actieve bezoekers
    2. Team
    3. Leden zoeken
  8. Downloads
  1. Home
  2. Forum
    1. Alle berichten
    2. Recente activiteiten
    3. Onopgeloste topics
  3. ICT Nieuws
  4. Blog
  5. Marktplaats
    1. Werk
    2. Advertenties
    3. Domeinnamen
    4. Websites
    5. Design & lay-outs
    6. Scripts
    7. Overige
  6. Design
  7. Leden
    1. Actieve bezoekers
    2. Team
    3. Leden zoeken
  8. Downloads
  1. Dé plek voor IT - ICTscripters
  2. Forum
  3. Scripting & programmeren
  4. PHP + SQL

Forum

  • nieuwe game

    frio 1 november 2026 om 14:08
  • Criminolz

    qevanto 31 oktober 2026 om 20:52
  • [Beta] Ottomaan: gratis browserspel met een echte, levende stad. Feedback gezocht!

    frio 27 oktober 2026 om 12:22
  • Port Father: beta van een browsergame in Antwerpen 1931, feedback welkom

    Jeroen.G 26 oktober 2026 om 10:33
  • Maffia Hotel: een browsergame waarin je van lobbygast naar spil van het hotel groeit

    eeyk 22 oktober 2026 om 18:43
  • Crime Club volledig herschreven vanaf nul

    frio 19 oktober 2026 om 23:57
  • Malavita (nieuwe maffia game, van 0)

    jos 19 oktober 2026 om 23:18
  • Herkent deze Notion-structuurscan echte problemen?

    Jeroen.G 19 oktober 2026 om 15:09

Marktplaats

  • [Aanbod] Stadskaart voor je browsergame: van menu naar klikbare stad, vanaf €200

    frio 29 oktober 2026 om 18:17
  • [Verkoop] G4G (Gangsters 4 Gangsters): volledige broncode, nieuw gebouwd in PHP 8.3 | € 30 per domein

    frio 27 oktober 2026 om 18:54
  • [TE KOOP] Malavita.be [Maffiaspel, gebaseerd op omicidio.nl, unieke code]

    Dpm_x 26 oktober 2026 om 00:22

[SQL]Veilig maken :D

  • ditismenno
  • 16 december 2013 om 20:56
  • ditismenno
    Baas van universal-games
    Berichten
    563
    • 16 december 2013 om 20:56
    • #1

    Beste,

    Zoals sommige zijden is mijn code niet veilig.
    Mijn code:

    PHP
    $id = mysqli_real_escape_string($mysqli, $id);
    if ($exec3 = $mysqli->query("SELECT * FROM `topics` WHERE catid='$id'")){
    	while($topic = $exec3->fetch_assoc()) {
    		$topicid = $topic['id'];
    		$topicid = mysqli_real_escape_string($mysqli, $topicid);
    		$exec4 = $mysqli->query("SELECT * FROM `reacties` WHERE topicid='$topicid'");
    		$reacties = $reacties + $exec4->num_rows;
    	}
    }


    Nu is mijn vraag kan iemand een voorbeeld geven van hoe het wel veilig is met wat uitleg erbij zodat ik het goed begrijp?

    Alvast bedankt.

    TEST ughost nu zelf "Klik hier voor trial"
    Let op:
    -Je pakket eindigd naar 2 weken dan worden ook alle bestanden verwijderd.
    -Je moet een eigen domein regelen (hebben,kopen)

  • Gast, wil je besparen op je domeinnamen? (ad)
  • Tim
    Expert
    Berichten
    3.684
    • 16 december 2013 om 21:55
    • #2

    Hallo,

    Prepared statements gebruiken en klaar :)
    http://www.php.net/pdo.prepared-statements

    Voor goede uitleg met voorbeelden.

    Mvg,
    Tim

    Master student IT-recht en Master student Ondernemingsrecht & software ingenieur
    My Personal profile
    My professional profile (LinkedIn/CV)

  • ditismenno
    Baas van universal-games
    Berichten
    563
    • 16 december 2013 om 22:00
    • #3

    Dus dan is dit een veilige code:

    PHP
    $id = mysqli_real_escape_string($mysqli, $id);
    if ($exec3 = $mysqli->prepare("SELECT * FROM `topics` WHERE catid=:id")){
    	$exec3->bindParam(':id', $id);
        while($topic = $exec3->fetch_assoc()) {
            $topicid = $topic['id'];
            $topicid = mysqli_real_escape_string($mysqli, $topicid);
            $exec4 = $mysqli->query("SELECT * FROM `reacties` WHERE topicid='$topicid'");
            $reacties = $reacties + $exec4->num_rows;
        }
    }


    En werkt deze dan ook goed?

    TEST ughost nu zelf "Klik hier voor trial"
    Let op:
    -Je pakket eindigd naar 2 weken dan worden ook alle bestanden verwijderd.
    -Je moet een eigen domein regelen (hebben,kopen)

  • M.Beers
    Elite members
    Berichten
    460
    • 16 december 2013 om 22:05
    • #4

    Hallo menno,

    Wij kunnen dit uiteraard niet zien of dit goed werkt, maar aan de syntax te zien is het goed.
    Bij elke invoer dat door een gebruiker wordt gedaan moet je de prepare statements toepassen dit wil uiteraard niet zeggen dat het automatisch ook veilig is! Scriptkiddies zijn je altijd een stap voor.

    Dit was mijn spreekbeurt, zijn er nog vragen?

  • ditismenno
    Baas van universal-games
    Berichten
    563
    • 16 december 2013 om 22:07
    • #5
    Citaat van M.Beers

    Hallo menno,

    Wij kunnen dit uiteraard niet zien of dit goed werkt, maar aan de syntax te zien is het goed.
    Bij elke invoer dat door een gebruiker wordt gedaan moet je de prepare statements toepassen dit wil uiteraard niet zeggen dat het automatisch ook veilig is! Scriptkiddies zijn je altijd een stap voor.


    Mag ik vragen hoe u dat dan doet?

    TEST ughost nu zelf "Klik hier voor trial"
    Let op:
    -Je pakket eindigd naar 2 weken dan worden ook alle bestanden verwijderd.
    -Je moet een eigen domein regelen (hebben,kopen)

  • M.Beers
    Elite members
    Berichten
    460
    • 16 december 2013 om 22:19
    • #6

    Dit is vrij lastig omdat er elke keer nieuwe dingen komen. Over het algemeen moet je rekening houden met:

    SQL Injections
    Dit is op te lossen met prepare statements

    XSS (Cross-site scripting)
    Dit is goed op te lossen door html code om te zetten naar html entities met htmlentities();

    CSRF (Cross-site request forgery)
    Dit is goed op te lossen door een unieke code mee te sturen met je formulier (token) deze veranderd elke keer als je website refreshed!

    Session Hijacking
    Dit los je goed op door een sessie ID te genereren met session_regenerate_id();

    En zo zijn er nog wel een x-aantal methodes

    Edit Nog een aanvulling op dit bericht waarbij ik denk dat het belangrijk is...

    1. Vertrouw je INPUTS nooit!
    2. Controlleer je inputs zo specifiek mogelijk (string, integer, decimal, ...) gebruik eventueel regex
    3. Probeer gewoon je site zelf of te laten hacken voor je hem online gooit voor groot publiek

    Dit was mijn spreekbeurt, zijn er nog vragen?

    Bewerkt één keer, laatst door M.Beers (16 december 2013 om 22:48).

  • Stefan.J
    Meester
    Berichten
    2.358
    • 16 december 2013 om 22:27
    • #7

    De code die je post is veilig tegen SQL-injections. Prepared statements zijn nog wel beter, maar dat is meer vanwege de execution plan cache. Daarbij, over performance gesproken, je code is nogal inefficient.

    De volgende code doet namelijk hetzelfde:

    PHP
    <?php
    
    
    $postCountStatement = $mysqli->prepare("SELECT COUNT(1) FROM reacties r INNER JOIN topics t ON r.topicid = t.id WHERE catid=?");
    $postCountStatement->bind_param('i', $categoryId);
    
    
    $postCountStatement->execute();
    $postCountStatement->bind_result($postCount);

    Mits is MySQLi helemaal correct heb gebruikt want ik heb die library nog vrijwel nooit gebruikt.

  • Luc
    Software Engineer
    Berichten
    1.989
    • 16 december 2013 om 22:29
    • #8

    @ M.Beers volgens mij haal jij CSRF door de war met XSS.

    CSRF is namelijk dat ik via javascript bijvoorbeeld jou een form kan laten submitten die vervolgens uitgevoerd wordt onder jouw naam. Moet je wel ingelogd zijn op dat moment.

    Website: https://devimo.nl
    Skype: https://join.skype.com/invite/dJyYILTt7Eqh

  • ditismenno
    Baas van universal-games
    Berichten
    563
    • 16 december 2013 om 22:41
    • #9

    Dank jullie zeer ik heb nu de code:

    PHP
    $exec3 = $mysqli->prepare("SELECT * FROM `topics` WHERE catid = ?");
    if ($exec3->execute(array($id))) {
    	while ($topic = $exec3->fetch()) {
    		$topicid = $topic['id'];
    		$topicid = mysqli_real_escape_string($mysqli, $topicid);
    		$topicid = htmlentities($topicid);
    		$exec4 = $mysqli->prepare("SELECT * FROM `reacties` WHERE topicid = ?");
    		$exec4->execute(array($topicid));
    		$reacties = $reacties + $exec4->num_rows;
    	}
    }
    Meer tonen


    En voel me een stuk veiliger :D

    TEST ughost nu zelf "Klik hier voor trial"
    Let op:
    -Je pakket eindigd naar 2 weken dan worden ook alle bestanden verwijderd.
    -Je moet een eigen domein regelen (hebben,kopen)

  • Stefan.J
    Meester
    Berichten
    2.358
    • 16 december 2013 om 22:42
    • #10

    Misschien eens kijken naar mijn reactie? Kun je een hoop performancewinst mee halen. ;)

    Paar opmerkingen op je huidige code nog:

    PHP
    $exec3 = $mysqli->prepare("SELECT * FROM `topics` WHERE catid = ?"); //Waarom selecteer je alle velden (incl. waarschijnlijk een blob of text), terwijl je alleen ID gebruikt? Ik zou de variabele ook geen exec3 noemen, dat is nogal nietszeggend.
    if ($exec3->execute(array($id))) {
        while ($topic = $exec3->fetch()) {
            $topicid = $topic['id']; //Variabele is een beetje overbodig, zou ik weglaten.
            $topicid = mysqli_real_escape_string($mysqli, $topicid); //Gezien je prepared statement heb je dit niet nodig.
            $topicid = htmlentities($topicid); //Je schrijft topicid niet naar het scherm, dus dit is niet nodig en onverstandig. Bovendien, is de ID geen integer?
            $exec4 = $mysqli->prepare("SELECT * FROM `reacties` WHERE topicid = ?"); //Tevens de wildcard selectie, selecteer hier bijvoorbeeld 1 of COUNT(1).
            $exec4->execute(array($topicid)); 
            $reacties = $reacties + $exec4->num_rows; //Bij de eerste loop krijg je hierop een NOTICE.
        }
    }
    Meer tonen
  • M.Beers
    Elite members
    Berichten
    460
    • 16 december 2013 om 22:49
    • #11

    Luc Excuses je hebt inderdaad gelijk, ik heb mijn vorige reactie aangevuld en CSRF er ook bij gezet.

    Dit was mijn spreekbeurt, zijn er nog vragen?

  • ditismenno
    Baas van universal-games
    Berichten
    563
    • 16 december 2013 om 23:16
    • #12
    Citaat van Stefan.J

    Misschien eens kijken naar mijn reactie? Kun je een hoop performancewinst mee halen. ;)

    Paar opmerkingen op je huidige code nog:

    PHP
    $exec3 = $mysqli->prepare("SELECT * FROM `topics` WHERE catid = ?"); //Waarom selecteer je alle velden (incl. waarschijnlijk een blob of text), terwijl je alleen ID gebruikt? Ik zou de variabele ook geen exec3 noemen, dat is nogal nietszeggend.
    if ($exec3->execute(array($id))) {
        while ($topic = $exec3->fetch()) {
            $topicid = $topic['id']; //Variabele is een beetje overbodig, zou ik weglaten.
            $topicid = mysqli_real_escape_string($mysqli, $topicid); //Gezien je prepared statement heb je dit niet nodig.
            $topicid = htmlentities($topicid); //Je schrijft topicid niet naar het scherm, dus dit is niet nodig en onverstandig. Bovendien, is de ID geen integer?
            $exec4 = $mysqli->prepare("SELECT * FROM `reacties` WHERE topicid = ?"); //Tevens de wildcard selectie, selecteer hier bijvoorbeeld 1 of COUNT(1).
            $exec4->execute(array($topicid)); 
            $reacties = $reacties + $exec4->num_rows; //Bij de eerste loop krijg je hierop een NOTICE.
        }
    }
    Meer tonen


    Beste bij reacties staat nog boven in de code $reacties = 0; dus daar krijg ik gene fout mee maar toch bedankt.
    Voor de rest heb ik real escape string nu weggehaald.
    En de variable weg gelaten alleen snap ik niet wat u bedoeld met:

    $topicid = htmlentities($topicid); //Je schrijft topicid niet naar het scherm, dus dit is niet nodig en onverstandig. Bovendien, is de ID geen integer?

    TEST ughost nu zelf "Klik hier voor trial"
    Let op:
    -Je pakket eindigd naar 2 weken dan worden ook alle bestanden verwijderd.
    -Je moet een eigen domein regelen (hebben,kopen)

  • Stefan.J
    Meester
    Berichten
    2.358
    • 16 december 2013 om 23:22
    • #13

    De topicid haal je door htmlentities heen, maar je gebruikt de variabele niet om naar de output te schrijven (echo), dus wat heeft het dan voor toegevoegde waarde?

    Waarom niet gaan voor de query uit mijn eerste reactie?

  • Tim
    Expert
    Berichten
    3.684
    • 16 december 2013 om 23:36
    • #14

    Hallo,

    Let op met HTMLEntitities dat je dit wel goed doet. Standaard geberuik is niet voldoende tegen XSS over het algemeen.
    Performance wise heeft Stefan zeker een punt, daar valt zeker wat uit te halen. Ook als je gaat kijke naar de onderhoudbaarheid.

    Mvg,
    Tim

    Master student IT-recht en Master student Ondernemingsrecht & software ingenieur
    My Personal profile
    My professional profile (LinkedIn/CV)

  • ditismenno
    Baas van universal-games
    Berichten
    563
    • 16 december 2013 om 23:39
    • #15
    Citaat van Tim

    Hallo,

    Let op met HTMLEntitities dat je dit wel goed doet. Standaard geberuik is niet voldoende tegen XSS over het algemeen.
    Performance wise heeft Stefan zeker een punt, daar valt zeker wat uit te halen. Ook als je gaat kijke naar de onderhoudbaarheid.

    Mvg,
    Tim

    Is HTMLEntitities nou alleen nodig met echo of ook bij query input?


    Beste ik heb nu weer een stukje code geschreven maar ik weet niet waarom hij niets echo't ik hoop dat iemand de fout ziet:

    PHP
    $exec5 = $mysqli->prepare("SELECT id,name FROM `topics` WHERE catid = ? ORDER BY id DESC LIMIT 0,1");
    $exec5 -> bind_param("i", $id);
    if ($exec5->execute) {
    	$count5 = $exec5->num_rows;
    	while ($topic2 = $exec5->fetch()) {
    		if ($count5 > 0){
    			$lastid = $topic2['id'];
    			$lastname = $topic2['name'];
    		} else {
    			$lastid = "/forum";
    			$lastname = "Geen topic's";
    		}
    	}
    }
    Meer tonen

    TEST ughost nu zelf "Klik hier voor trial"
    Let op:
    -Je pakket eindigd naar 2 weken dan worden ook alle bestanden verwijderd.
    -Je moet een eigen domein regelen (hebben,kopen)

  • WHMCSAddons
    Meester
    Berichten
    2.411
    • 17 december 2013 om 00:08
    • #16
    Citaat van ditismenno

    Is HTMLEntitities nou alleen nodig met echo of ook bij query input?


    Beste ik heb nu weer een stukje code geschreven maar ik weet niet waarom hij niets echo't ik hoop dat iemand de fout ziet:

    PHP
    $exec5 = $mysqli->prepare("SELECT id,name FROM `topics` WHERE catid = ? ORDER BY id DESC LIMIT 0,1");
    $exec5 -> bind_param("i", $id);
    if ($exec5->execute) {
    	$count5 = $exec5->num_rows;
    	while ($topic2 = $exec5->fetch()) {
    		if ($count5 > 0){
    			$lastid = $topic2['id'];
    			$lastname = $topic2['name'];
    		} else {
    			$lastid = "/forum";
    			$lastname = "Geen topic's";
    		}
    	}
    }
    Meer tonen

    Misschien omdat er geen echo of print functie instaat die je de waarde kan tonen, als ik uitga van dit gedeelte tenminste.

  • ditismenno
    Baas van universal-games
    Berichten
    563
    • 17 december 2013 om 00:22
    • #17

    Sorry de code staat er zo:

    PHP
    $exec5 = $mysqli->prepare("SELECT id,name FROM `topics` WHERE catid = ? ORDER BY id DESC LIMIT 0,1");
    if ($exec5->execute(array($id))) {
    	$count5 = $exec5->num_rows;
    	while ($topic2 = $exec5->fetch()) {
    		if ($count5 > 0){
    			$lastid = $topic2['id'];
    			$lastname = $topic2['name'];
    		} else {
    			$lastid = "/forum";
    			$lastname = "Geen topic's";
    		}
    	}
    	echo '
    		<tr>
    			<td><a href="cat/'.$id.'">'.$name.'</a></td>
    			<td><div class="topic"><span>'.$topics.'</span> topic\'s<br /> <span>'.$reacties.'</span> reacties</td></div>
    			<td><div class="lasttopic"><a href="'.$lastid.'">'.$lastname.' 1</a></div></td>
    		</tr>
    	';
    }
    Meer tonen


    Maar nu echo't hij niets dus waarschijnlijk is er iets mis met de query.

    TEST ughost nu zelf "Klik hier voor trial"
    Let op:
    -Je pakket eindigd naar 2 weken dan worden ook alle bestanden verwijderd.
    -Je moet een eigen domein regelen (hebben,kopen)

Registratie

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

Nu registreren Aanmelden

ICT Nieuws

  • PHP waarschuwt voor twee ernstige bugs die makkelijk uit te buiten lijken

    Aaron 22 oktober 2026 om 22:19

Blogs

  • Functioneel ontwerp

    Dees 28 december 2014 om 12:38
  • Access Control List implementatie in PHP/MySQL - deel 1/2

    FangorN 28 december 2018 om 12:35
  • Access Control List implementatie in PHP/MySQL - deel 2/2

    FangorN 29 december 2018 om 12:37

Gebruikers die dit topic bekijken

  • 2 Gasten
  1. Marktplaats
  2. Design
  3. Voorwaarden
  4. Ons team
  5. Leden
  6. Geschiedenis
  7. Regels
  8. Links
  9. Privacyverklaring
  10. Contact
ICTscripters ©2005 - 2026 , goedkope hosting door DiMoWeb.com, BE0558.915.582
Sponsors: Beste kattenhotel provincie Antwerpen
Style: Nexus by cls-design
Stylename
Nexus
Manufacturer
cls-design
Licence
Commercial styles
Help
Supportforum
Visit cls-design