geparametriseerde query

Status
Niet open voor verdere reacties.

alexanderinfo

Gebruiker
Lid geworden
24 mrt 2008
Berichten
95
goedemorgen,

Hieronder staat een stukje script die niet veilig is.
Ik moet deze herschrijven om het SQLI veilig te maken.
Ik heb het geprobeerd met escapen, maar dat houdt alleen bepaalde karakters tegen.
Het script moet ook beveiligd worden tegen bv OR 1=1.
Ik heb het geprobeerd met wat tutorials, maar snap niet precies hoe een geparametriseerde query werkt.
Ik ben nieuw op dit forum en hoop dat ik hier goed zit, anders hoor ik het graag.

Ik vraag niet voor een quick fix, want daar leer ik zelf niets van.
Ik heb de code geplaatst, zodat het makkelijker is om te zien waar ik het over heb.

Alvast bedankt voor de moeite.

PHP:
mysql_connect("localhost", "cms", "cms");
mysql_select_db("cms_nl");

if (!isset($_GET['cmd'])) {
header("Location: ?cmd=show&id=1");
exit;
}

switch($_GET['cmd']) {
case "show":
if (isset($_GET['id'])) {
print getPage(mysql_real_escape_string($_GET['id']));
}
break;

case "search":
if (isset($_GET['query'])) {
print search(mysql_real_escape_string($_GET['query']));
}
break;
}

function getPage($id) {
$result = mysql_query("SELECT title, body FROM pages WHERE id = $id");
$res = mysql_fetch_assoc($result);
print "<h1>" . $res['title'] . "</h1>" . $res['body'];
}

function search($query) {
$result = mysql_query("SELECT title FROM pages WHERE title like '%$query%' OR body like '%$query%'");
print "<ul>";
while($res = mysql_fetch_assoc($result)) {
print "<li>" . $res['title'] . "</li>";
}
print "</ul>";
}
 
Je hebt het over SQLi maar gebruikt nog mysql_*-functies, begin dus eerst met ombouwen naar MySQLi :)

In dit voorbeeld heb je meteen een prepared statement welke je kunt gebruiken: http://php.net/manual/en/mysqli.prepare.php

Gebruik bij voorkeur de Object Oriented style.

Ook is het aan te raden geen print of echo in functies te gebruiken, geef in plaats daarvan het resultaat binnen de functie terug :)
 
Je hebt het over SQLi maar gebruikt nog mysql_*-functies, begin dus eerst met ombouwen naar MySQLi :)

In dit voorbeeld heb je meteen een prepared statement welke je kunt gebruiken: http://php.net/manual/en/mysqli.prepare.php

Gebruik bij voorkeur de Object Oriented style.

Ook is het aan te raden geen print of echo in functies te gebruiken, geef in plaats daarvan het resultaat binnen de functie terug :)

Tha Devil,

Bedankt voor je reactie.
Dit script herschrijven is ook voor een oefening.
het is opzettelijk geschreven om het kwetsbaar te maken.

ik moet het herschrijven. echter heb ik meerdere tutorials bekeken en was het mij niet duidelijk hoe te beginnen.
met jouw link wordt het al wat duidelijker.
 
test en bekijk dit onder voorbehoud van fouten

PHP:
<?php
if (!isset($_GET['cmd'])) {
    header("Location: ?cmd=show&id=1");
    exit;
}
$helper = new helpmij();
switch ($_GET['cmd']) {
    case "show":
        if (isset($_GET['id'])) {
            $helper->getpage($_GET['id']);
        }
        break;

    case "search":
        if (isset($_GET['query'])) {
            $helper->search($_GET['query']);
        }
        break;
}
class helpmij{
    private $PDOtje;
	/**
	 * helpmij::__construct()
	 * @return void
	 */
	public function __construct() {
	   $this->PDOtje = self::connect("localhost","cms_nl", "cms", "cms");
	}
    /**
     * helpmij::connect()
     * @param mixed $host
     * @param mixed $dbname
     * @param mixed $usr
     * @param mixed $pwd
     * @return
     */
    private function connect($host,$dbname,$usr,$pwd){
       $conn = 'mysql:host='.$host.';dbname='.$dbname;
        //odbc_connect($conn,$usr,$pwd) or die(odbc_errormsg() );
        try{
            $this->_dbConn = new PDO($conn, $usr, $pwd, self::getoptions());
            return  $this->_dbConn;
        }catch(Exception $ex){
            return false;
        }
    }
    /**
     * helpmij::getoptions()
     * @return
     */
    private function getoptions(){
        return array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'",PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
    }
    
    /**
     * helpmij::getpage()
     * @param mixed $id
     * @return
     */
    public function getpage($id){
        try {
            $stmt = $this->PDOtje->prepare("SELECT title, body FROM pages WHERE id=:id");
            $stmt->bindParam(':id',$username);
            $stmt->execute();
            if($res = $stmt->fetch(PDO::FETCH_ASSOC)) {
               print "<h1>" . $res['title'] . "</h1>" . $res['body'];
            }
        }catch (PDOException $e) {
               print "Ge gaat nog nen keer moeten zoeken achter een foutje in dit script";
               return false;
        }
    }
    /**
     * helpmij::search()
     * @param mixed $me
     * @return
     */
    public function search($me){
        try {
            $stmt = $this->PDOtje->prepare("SELECT title FROM pages WHERE title like:me OR body like:me");
            $stmt->bindParam(':me',$me);
            $stmt->execute();
            print "<ul>";
                while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
                    print "<li>" . $row['title'] . "</li>";
                }
            print "</ul>";
        }catch (PDOException $e) {
               print "Ge gaat nog nen keer moeten zoeken achter een foutje in dit script";
               return false;
        }
    }
}

?>
 
Laatst bewerkt:
test en bekijk dit onder voorbehoud van fouten

PHP:
<?php
if (!isset($_GET['cmd'])) {
    header("Location: ?cmd=show&id=1");
    exit;
}
$helper = new helpmij();
switch ($_GET['cmd']) {
    case "show":
        if (isset($_GET['id'])) {
            $helper->getpage($_GET['id']);
        }
        break;

    case "search":
        if (isset($_GET['query'])) {
            $helper->search($_GET['query']);
        }
        break;
}
class helpmij{
    private $PDOtje;
	/**
	 * helpmij::__construct()
	 * @return void
	 */
	public function __construct() {
	   $this->PDOtje = self::connect("localhost","cms_nl", "cms", "cms");
	}
    /**
     * helpmij::connect()
     * @param mixed $host
     * @param mixed $dbname
     * @param mixed $usr
     * @param mixed $pwd
     * @return
     */
    private function connect($host,$dbname,$usr,$pwd){
       $conn = 'mysql:host='.$host.';dbname='.$dbname;
        //odbc_connect($conn,$usr,$pwd) or die(odbc_errormsg() );
        try{
            $this->_dbConn = new PDO($conn, $usr, $pwd, self::getoptions());
            return  $this->_dbConn;
        }catch(Exception $ex){
            return false;
        }
    }
    /**
     * helpmij::getoptions()
     * @return
     */
    private function getoptions(){
        return array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'",PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
    }
    
    /**
     * helpmij::getpage()
     * @param mixed $id
     * @return
     */
    public function getpage($id){
        try {
            $stmt = $this->PDOtje->prepare("SELECT title, body FROM pages WHERE id=:id");
            $stmt->bindParam(':id',$username);
            $stmt->execute();
            if($res = $stmt->fetch(PDO::FETCH_ASSOC)) {
               print "<h1>" . $res['title'] . "</h1>" . $res['body'];
            }
        }catch (PDOException $e) {
               print "Ge gaat nog nen keer moeten zoeken achter een foutje in dit script";
               return false;
        }
    }
    /**
     * helpmij::search()
     * @param mixed $me
     * @return
     */
    public function search($me){
        try {
            $stmt = $this->PDOtje->prepare("SELECT title FROM pages WHERE title like:me OR body like:me");
            $stmt->bindParam(':me',$me);
            $stmt->execute();
            print "<ul>";
                while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
                    print "<li>" . $row['title'] . "</li>";
                }
            print "</ul>";
        }catch (PDOException $e) {
               print "Ge gaat nog nen keer moeten zoeken achter een foutje in dit script";
               return false;
        }
    }
}

?>

kenikavanbis, bedankt voor je reactie.
de code wordt gecontroleerd op de redirect en dat gaat goed.
maar zodra er wordt gecontroleerd of de pagina gelijk is gebleven, loopt ie vast.
ik ga dinsdag met jouw script verder.

echt heel erg bedankt.
 
ik heb terloops al een fout in mijn editie gevonden op de lijnen 41 en bis

PHP:
            $this->_dbConn = new PDO($conn, $usr, $pwd, self::getoptions());
            return  $this->_dbConn;
dit omdat ik de variabele in het object niet heb voorzien.(ik had snel wat code samengeraapt van een groter geheel) het is belangerijk dat je de fouten meld zodat ik kan kijken waar ik mogelijks fout zit zat.(let op als het voor een enige taak is zult u het ook moeten uitleggen).
PHP:
            $dbConn = new PDO($conn, $usr, $pwd, self::getoptions());
            return  $dbConn;
kan je ook de regels 69 en 89 betreft aanpassen naar
PHP:
print "Ge gaat nog nen keer moeten zoeken achter een foutje in dit script <h3>".$e."</h3> ";//TODO verwijder mijn lijn voor u me upload
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan