Jo: SQL Injection

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

  1. 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

    1. 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

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      Die ultimative Seite für Selbermacher
  2. 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

    1. 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)

    2. 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.