[SQL]Veilig maken :D

  • 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)

  • Guest, wil je besparen op je domeinnamen? (ad)
  • 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)

  • 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.

  • 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)

  • 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 ().

  • 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.

  • Dank jullie zeer ik heb nu de code:


    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)

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


    Paar opmerkingen op je huidige code nog:


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


    Paar opmerkingen op je huidige code nog:



    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)

  • 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:

    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)

  • 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:


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

  • Sorry de code staat er zo:


    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!