• Login
  • Register
  • Zoek
This Thread
  • Everywhere
  • This Thread
  • This Forum
  • Articles
  • Pages
  • Forum
  • Filebase Entry
  • More Options

ICTscripters

Dé plek voor IT

Dé plek voor IT

Login

Geavanceerde opties
  1. Home
  2. Forum
    1. Alle berichten
    2. Recente activiteiten
  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
  9. Goedkope domeinnamen
  1. Home
  2. Forum
    1. Alle berichten
    2. Recente activiteiten
  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
  9. Goedkope domeinnamen
  1. Home
  2. Forum
    1. Alle berichten
    2. Recente activiteiten
  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
  9. Goedkope domeinnamen
  1. Dé plek voor IT - ICTscripters
  2. Forum
  3. Scripting & programmeren
  4. PHP + SQL

Forum

  • Beta-testers gezocht voor Crypto-oefenplatform

    Syntax 29 januari 2026 om 16:11
  • Na 15 jaar terug van weggeweest: iCriminals.nl is terug (BETA)!

    Syntax 19 januari 2026 om 09:34
  • Developer Gezocht

    Mikevdk 10 januari 2026 om 18:57
  • Op zoek naar de legends

    Syntax 5 januari 2026 om 13:50
  • [FREE] WeFact Hosting module

    Jeroen.G 13 oktober 2025 om 14:09
  • Help testers nodig voor android app Urgent

    urgentotservices 26 september 2025 om 10:21
  • Versio vervanger

    Jeroen.G 25 augustus 2025 om 15:56
  • Afspraken systeem met planbeperking

    Lijno 1 augustus 2025 om 23:04

Marktplaats

  • 350 Nieuwe Domeinnamen Januari 2026

    shiga 1 februari 2026 om 14:21
  • 321 Nieuwe Domeinnamen December 2025

    shiga 1 januari 2026 om 10:26
  • Meerdere mafia game template te koop

    Syntax 26 december 2025 om 00:07

[SQL]Veilig maken :D

  • ditismenno
  • 16 december 2013 om 20:56
  • ditismenno
    Baas van universal-games
    Ontvangen Reacties
    1
    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)

  • Tim
    Enlightened
    Ontvangen Reacties
    77
    Berichten
    3.686
    • 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
    Ontvangen Reacties
    1
    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
    Ontvangen Reacties
    31
    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
    Ontvangen Reacties
    1
    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
    Ontvangen Reacties
    31
    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
    Master
    Ontvangen Reacties
    9
    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
    Ontvangen Reacties
    44
    Berichten
    1.986
    • 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
    Ontvangen Reacties
    1
    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;
    	}
    }
    Toon Meer


    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
    Master
    Ontvangen Reacties
    9
    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.
        }
    }
    Toon Meer
  • M.Beers
    Elite members
    Ontvangen Reacties
    31
    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
    Ontvangen Reacties
    1
    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.
        }
    }
    Toon Meer


    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
    Master
    Ontvangen Reacties
    9
    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
    Enlightened
    Ontvangen Reacties
    77
    Berichten
    3.686
    • 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
    Ontvangen Reacties
    1
    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";
    		}
    	}
    }
    Toon Meer

    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
    Master
    Ontvangen Reacties
    88
    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";
    		}
    	}
    }
    Toon Meer

    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
    Ontvangen Reacties
    1
    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>
    	';
    }
    Toon Meer


    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)

Participate now!

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

Maak een account aan Login

ICT Nieuws

  • Fijne feestdagen

    tcbhome 28 december 2025 om 13:55
  • Kritieke update voor Really Simple Security-plug-in

    K.Rens 16 november 2024 om 16:12
  • ING Nederland streeft naar ondersteuning van Google Pay tegen eind februari

    K.Rens 2 november 2024 om 16:09

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
  1. Marktplaats
  2. Design
  3. Voorwaarden
  4. Ons team
  5. Leden
  6. Geschiedenis
  7. Regels
  8. Links
  9. Privacy Policy
ICTscripters ©2005 - 2026 , goedkope hosting door DiMoWeb.com, BE0558.915.582
Sponsors: Beste kattenhotel provincie Antwerpen | Beste Zetes eid kaartlezer webshop
Style: Nexus by cls-design
Stylename
Nexus
Manufacturer
cls-design
Licence
Commercial styles
Help
Supportforum
Visit cls-design