Hallo,
seit Tagen bastle ich an einem einfachen script (zum einlernen), welches gegen SQL Injektion abgesichert sein soll. Hierbei habe ich mich stark eingelesen (unter anderen Links von hausl, Protestix und Hellbringer) und nun folgendes script mal erstellt und wollte Fragen, ob hier mal ein Profi ein Auge drauf werfen kann, ob das so gegen SQL Injection sicher ist oder nicht.
Aufgabe ist es einfach, 3 Variablen, welche mit GET übergeben werden, in eine SQL Query zu packen welche dann per PDO prepared statments die Datenbank abfrägt.(1 x where mit genauen Bedingungen, 1 x like und einmal order). Das Script funktioniert gem. Teststellung, es geht ausschliesslich nur um die SQL injection, nicht um den Sinn der Abfrage
Hier mal das script in der Hoffnung, dass es sicher ist.
Aufruf wäre zum Beispiel seite.php?vorname=Björn&name=K&orderby=email
Gruß
Falke07
seit Tagen bastle ich an einem einfachen script (zum einlernen), welches gegen SQL Injektion abgesichert sein soll. Hierbei habe ich mich stark eingelesen (unter anderen Links von hausl, Protestix und Hellbringer) und nun folgendes script mal erstellt und wollte Fragen, ob hier mal ein Profi ein Auge drauf werfen kann, ob das so gegen SQL Injection sicher ist oder nicht.
Aufgabe ist es einfach, 3 Variablen, welche mit GET übergeben werden, in eine SQL Query zu packen welche dann per PDO prepared statments die Datenbank abfrägt.(1 x where mit genauen Bedingungen, 1 x like und einmal order). Das Script funktioniert gem. Teststellung, es geht ausschliesslich nur um die SQL injection, nicht um den Sinn der Abfrage
Hier mal das script in der Hoffnung, dass es sicher ist.
Aufruf wäre zum Beispiel seite.php?vorname=Björn&name=K&orderby=email
PHP-Code:
if (isset($_GET['vorname'])) $vorname=$_GET['vorname']; else $vorname='';
if (isset($_GET['name'])) $name=$_GET['name']; else $name='';
try { $conn=new PDO('mysql:host=localhost;dbname=db;charset=utf8',usr,passw,array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING)); }
catch (PDOException $e) { echo 'Verbindung fehlgeschlagen: ' . $e->getMessage();
exit;
}
if ($vorname!='' and $name!='')
{
$sql="select name, email from tabelle where vorname = :vorname and name like :name";
$ordernames=array('name','email'); // definieren, welche Spalten nur für order gültig sind
if (in_array($_GET['orderby'], $ordernames))
$sql .= sprintf(" ORDER BY `%s` ASC", $_GET['orderby']);
$statm= $conn->prepare($sql);
$statm->bindParam(':vorname',$vorname);
$statm->bindValue(':name',"%".$name."%");
$statm->execute();
foreach ($statm as $row)
{
echo htmlspecialchars($row['name'])." ".htmlspecialchars($row['email'])."<br />";
}
}
$conn=null;
Falke07
Kommentar