Dynamische Bind Params mit MySQLi

19 Jan 2016
by marc

SQL-Injections sind Probleme die man als Online Software-Betreiber nicht gebrauchen kann. Diese Sicherheitslücken entstehen durch Nichtwissen, Bequemlichkeit und durch stressige Projekte. Viele benutzen PDO oder MySQLi und denken das sie damit alles in punkto Sicherheit erfüllt haben. Weit gefehlt! Ohne die Benutzung von Prepared Statements (Bindings), wird man auch hier Lücken finden und sich einen Zugang erschleichen können.

 

Was können wir da gegen tun?

Wie schon erwähnt, können wir Binding Params bei MySQLi und PDO verwenden. Sicher ist das ein wenig mehr Aufwand, aber wenn man wert auf eine strikte Typisierung legt, muss der Mehraufwand gar nicht sein. Im folgenden Beispiel zeige ich euch wie man dynamische Binds Param mit MySQLi verwenden kann.

Als erstes schreiben wir einen Query. Als Beispiel verwenden wir eine Loginabfrage.


$db = $meine_datenbank_verbindungsdaten_die_streng_geheim_sind;
$email = "show@irgendeinemail.xx";
$passwort = "meinpasswort";

SQL-Anweisung, die Fragezeichen sind unsere Binds

$sql="SELECT id FROM accounts WHERE email=? AND md5_passwd=? ";

Wir legen die Email und das Passwort in ein array(), in der gleichen Reihenfolge wie die Fragezeichen

$bindings = array($email, md5($passwort));

prepare

$stmt = $db->prepare($sql);

$type="";

An dieser Stelle werten wir die Typen aus.
Wer das nicht Strikt hat, muss den Type-String
selbst schreiben, sonst erkennt die Schleife wahrscheinlich richtig um welchen Type es sich handelt.
Dies ist auch nur ein vereinfachtes Beispiel!

Bind-Parameters. Types: s = string, i = integer, d = double,  b = blob

foreach($binding AS $b) {

if(is_int($b)) {
$type.="i";
}

if(is_double($b)) {
$type.="d";
}

if(is_string($b)) {
$type.="s";
}

}

$queryParams = array();
$queryParams[] = $type;

foreach ($binding as $id => $term) {
$queryParams[] = &$binding[$id];
}

Als nächstes kommt der user_call

call_user_func_array(array($stmt, 'bind_param'), $queryParams);

Daten holen

$stmt->execute();
$result=$stmt->get_result();
$stmt->close();

$daten =  $result->fetch_assoc();



var_dump($daten);


Ihr braucht euch das Beispiel nur Anpassen, evtl. eine Funktion oder Klasse erstellen und schon habt ihr einen kleinen „Mapper“.

Leave a Comment:

* - required fields

EWU Software GmbH © 2017