Beveiligen met PDO

  • Hallo iedereen,


    Ik ben zonet begonnen met het leren van PDO. Echter loop het niet zo vlotjes als ik hoopte.
    Ik ben een kleine source van mij aan het omzetten, om er dan mee verder te gaan.
    Ik maak mijn databaseconnectie in het bestand: config.php


    Maar dan gebruik ik in het bestand functions.php een functie waarbij ik de functie: quote van PDO gebruik.
    Het ziet er als volgt uit:


    PHP
    //Beveiligingsfuncties 
    function sql($tekst){ 
        $tekst = $db->quote($tekst); 
        $tekst = addslashes($tekst); 
        return $tekst; 
    }


    Echter krijg ik nu de error bij een query:


    PHP
    Fatal error: Call to a member function quote() on a non-object in /home/laurens/domains/****************/public_html/include/functions.php on line 16


    Weet iemand wat er fout zou kunnen zijn? Dit is de lijn waarop de functie: $sql wordt gebruikt:


    PHP
    $sql = "INSERT INTO gebruikers (gebruikersnaam, wachtwoord, ipadres, emailadres) VALUES ('".sql($gebruikersnaam)."', '".sql(encryptie($wachtwoord))."', '".$ipadres."', '".sql($emailadres)."')";  
    $db->exec($sql);


    Alvast bedankt,
    Laurens

  • Normaal zou dit zo moeten werken


    PHP
    //Beveiligingsfuncties 
    function sql($tekst){ 
        global $db;
    
    
        $tekst = $db->quote($tekst); 
        $tekst = addslashes($tekst); 
        return $tekst; 
    }


    Dit heb ik zonet geprobeerd, maar dit lukt niet.


    Tim bedankt voor je antwoord, ik zal het tijdelijk oplossen door middel van een 2de parameter mee te geven aan de functie.
    Omdat ik nog niet veel verstand heb van classes, etc.


    Heeft er iemand misschien een goede tutorial over?

  • PHP
    //Beveiligingsfuncties 
    function sql($db, $tekst){ 
        $tekst = $db->quote($tekst); 
        $tekst = addslashes($tekst); 
        return $tekst; 
    }
  • Zoals al eerder werd vermeld is addslashes niet benodigd bij PDO,
    Zeker niet als je PDO in combinatie met de Prepare functie gaat gebruiken.
    Dan komt je query er ongeveer zo uit te zien:


    Voor elke variabele die je in een query wilt gebruiken moet je een bind param aanmaken.
    indien de variabele enkel (altijd) een getal is dan gebruik je INT ipv STR


    Met vriendelijke groet,
    Mathijs Lormans


    Designer / Sustainability expert: Lormans Design
    Design, Engineering and Development
    Bouwkundig ontwerp, tekenwerk, advies en projectmanagement!
    3D modeling en 3D printing

  • Beste L.Kok,


    natuurlijk is dit mogelijk.


    Van OOP heb ik persoonlijk geen kennis maar kan je wel uitleggen hoe je op een 'standaard' manier connectie maakt etc.


    Op de manier zoals ik laat zien maak je op iedere pagina een nieuwe DB connectie.


    Je begint met een Try (hier probeer je DB connectie te maken)
    in de Catch aan het einde van de pagina worden alle fouten afgevangen welke je db connectie en/of je query's geven.
    Dit is dus handig bij het debuggen van je script.


    Na de Catch word de db verbinding weer afgesloten.


    Vervolgens maak je connectie met je database, (lijkt mij duidelijk, is de 'standaard PDO manier')

    PHP
    $host = "localhost";
    $poort = ""; // normaal niet nodig
    $dbname = "database naam";
    $gbnaam = "Gebruikersnaam database";
    $wachtwoord = "wachtwoord bij gebruikersnaam database";


    Vervolgens ga je een Statment maken (een PDO query)
    Door hierbij Prepare te gebruiken ga je eerst de query naar de server sturen & word gecontroleerd of dat deze klopt (zo voorkom je half uitgevoerde query's)
    Tevens is door de prepare functie het onnodig om addslashes etc te doen. want dit word al door de prepare functie gecontroleerd.


    Enkel kun je in de prepare query geen PHP variabele invoegen. ipv voer je de 'variabelen' in met een :
    Dus inplaats van `login` = "$login" krijg je `login` = :login


    Hierna dien je de parameter :login dus een waarde mee te geven, dit doe je door de Bindparam functie.
    aan het einde van de Bindparam functie kun je aangeven of het een STR ('String' tekst of tekst gecombineerd met cijfers) of een INT (enkel cijfers betreft)
    Indien je niet zeker van de input bent dus altijd STR gebruiken.


    Ten slotte dien je de statement nog uit te voeren, met de definitieve paramters erin: dit is de execute lijn.


    Hierbij nog een link naar een tutorial waarin het nog eens duidelijk, stap voor stap word uitgelegd.
    http://www.sitemasters.be/tuto…PHP/PDO_(PHP_Data_Objects)

    Met vriendelijke groet,
    Mathijs Lormans


    Designer / Sustainability expert: Lormans Design
    Design, Engineering and Development
    Bouwkundig ontwerp, tekenwerk, advies en projectmanagement!
    3D modeling en 3D printing

Participate now!

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