SQL Injection
Jo
- php
Hallo,
Hallo zusammen,
ich möchte eine GET Variable in meinem SQL einbauen um eine Abfrage auf eine PostgreSQL DB zu starten. Ich dachte bisher folgende Behandlung mit pg_escape_string würde mich vor SQL Injection bewahren:
# URL Variable
if (empty($_GET['id'])) {
echo "parameter fehlt: <i>id</i>";
exit;
} else {
$id = pg_escape_string($_GET['id']);
}
//SQL bauen und ausführen
$sql = "SELECT * FROM usernamen WHERE id = ".$id;
$rs = pg_query($dbconn, $sql);
...
Jetzt habe ich aber festgestellt das ich z.B. beim Aufruf meines Scripts durch Übergabe folgender Variable alles andere als sicher bin:
datei.php?id=1;delete from usernamen
Mein SQL sieht dann so aus und das Escapen bringt mir gar nix:
SELECT * FROM usernamen WHERE id = 1;delete from usernamen
Wie muss ich die übergebene Variable behandeln um alle Eventualitäten abzufangen?
Danke + Gruß
Jo
Hallo Jo,
Wie muss ich die übergebene Variable behandeln um alle Eventualitäten abzufangen?
Ein Blick ins Handbuch zeigt dass pg_escape_string() nicht das macht was PDO::quote macht - die Anführungszeichen um den Wert musst du hier schon selbst einfügen.
Gruß,
Tobias
Hello,
Wie muss ich die übergebene Variable behandeln um alle Eventualitäten abzufangen?
Ein Blick ins Handbuch zeigt dass pg_escape_string() nicht das macht was PDO::quote macht - die Anführungszeichen um den Wert musst du hier schon selbst einfügen
Außerdem weiß er ja, dass ein numerischer Wert erwartet wird und kann den Parameter daher entsprechend behandeln/filtern.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Wäre dann so was o.k.?
function GetSQLValueString($theValue, $theType) {
$theValue = (get_magic_quotes_gpc()) ? stripslashes($theValue) : $theValue;
switch ($theType) {
case 'text':
$theValue = pg_escape_string($theValue);
break;
case 'int':
$theValue = intval($theValue);
break;
case 'double':
$theValue = str_replace(',', '.', $theValue);
$theValue = floatval($theValue);
break;
}
return $theValue;
}
# URL Variable
if (empty($_GET['id'])) {
echo "parameter fehlt: <i>id</i>";
exit;
} else {
$id = GetSQLValueString($_GET['id'],"int");
}
Gruß
Jo
Was du brauchst sind ' ' um deinen Stringwert im SQL falls die ID wirklich ein String ist, oder einen Test ob sie eine Zahl ist. Ich nehme an sie ist eine Zahl, dann musst du prüfen ob dem so ist.
Deine Funktion hat mit dem Problem und auch mit der Antwort von tk nichts zu tun.
Eine Funktion Get...String zu nennen wenn sie verschiedene Typen zurückgibt halte ich übrigens für keine übersichtliche Idee.
Setze im SQL bereits die Anführungszeichen für einen Stringwert, dann bist du auf der sicheren Seite. (Sofern es sich wirklich um einen String handelt)
Tach!
Wäre dann so was o.k.?
Solch eine Funktion lohnt sich nicht. Man muss immer noch aufpassen und die richtigen Parameter übergeben, damit korrekt maskiert wird. Besser und einfacher sind Prepared Statements zu verwenden. Da ist prinzipbedingt keine Maskierung erforderlich, also kann auch keine vergessen oder die falsche angewendet werden.
dedlfix.