Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Für SQL-Injection verwundbares Prepared Statement

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von exzel, 12 Dezember 2013.

  1. exzel

    exzel Datenbank-Guru

    Hallo zusammen,

    bei folgendem Prepared Statement wird die Vertragsnummer direkt übergeben. Ist damit das Prepared Statement angreifbar für eine SQL-Injection?

    $stmt=$mysqli->prepare("SELECT hauptsparte, untersparte, notiz FROM vertrag WHERE vertrag= '{$_SESSION['vertrag']}';");


    Gruß

    Alex
     
  2. ukulele

    ukulele Datenbank-Guru

    So wie ich die Materie bisher verstanden habe und akretschner es erklärt hat nein. Der Inhalt der Variable der in Vertrag='{$_SESSION['vertrag']}' aufgenommen wird wird nur als ein Wert behandelt und nicht als SQL Code.
     
  3. akretschmer

    akretschmer Datenbank-Guru

    Beim Prepare wird das nur vorbereitet, nicht ausgeführt. Ausgeführt wird es beim Execute. Dort bekommst dann aber keine SQL-Injection mehr, von daher sage ich mal vorsichtig, daß ist so sicher.

    Mich wundert nur, daß das Prepare nicht nur mit einem Platzhalter definiert wird, in Plain SQL unter PG geht es so:

    Code:
    test=# select * from foo;
     mitarbeiter | anzahl
    -------------+--------
     hans  |  10
     otto  |  20
     willi  |  50
     anna  |  130
    (4 rows)
    
    test=*# prepare mein_select(text) as select * from foo where mitarbeiter = $1;
    PREPARE
    test=*# execute mein_select('otto');
     mitarbeiter | anzahl
    -------------+--------
     otto  |  20
    (1 row)
    
    
    Aber PHP, MySQL, ...
     
  4. exzel

    exzel Datenbank-Guru

    Hallo und danke für die Antworten,

    also normalerweise wird die Übergabe der Variablen an das Prepared Statement schon durchgeführt. Sieht dann so aus.

    $stmt=$mysqli->prepare("SELECT hauptsparte, untersparte, notiz FROM vertrag WHERE vertrag=?;");
    $stmt->bind_param("i", $_SESSION['vertrag']);

    Für mich ist da eben die Frage, ob die Absicherung gegen Injections nur so funktioniert oder auch durchgeführt wird, wenn die Variablen direkt übergeben werden?

    Gruß
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Ich sehe im prepare 1 Parameter, im bind 2.

    Ähm, vielleicht fragst das in einer PHP-Selbsthilfegruppe mal, ich bin da jetzt nicht so fitt. Ich weiß nicht, was da real in der DB ankommt, welche Logig da der mysqli - Treiber von PHP macht.
     
  6. exzel

    exzel Datenbank-Guru

    Hattest recht. Das ist eine Frage für ein PHP Forum. Sorry. Nur der Vollständigkeit halber. Damit ein Prepared Statement tatsächlich geschützt ist, müssen alle Parameter übergeben werden sowie im 4 Beitrag gezeigt.
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Ja, wenn N Parameter definiert sind, müssen auch so viele kommen.

    Code:
    test=# prepare mein_select(text) as select * from foo where mitarbeiter = $1 and  anzahl = $2;
    PREPARE
    test=*# execute mein_select('otto');
    ERROR:  wrong number of parameters for prepared statement "mein_select"
    DETAIL:  Expected 2 parameters but got 1.
    
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Ha, gesehen!
     
  9. exzel

    exzel Datenbank-Guru

    Ja, das schon. Ich meinte aber nicht die Anzahl, sondern das Prinzip. Damit das Prepared Statement geschützt ist, müssen die Variablen den Plazthaltern übergeben werden und nicht wie im ersten Beitrag gezeigt direkt im Prepared Statement stehen.
     
Die Seite wird geladen...
Ähnliche Themen - Injection verwundbares Prepared
  1. sklansky18
    Antworten:
    1
    Aufrufe:
    764
  2. ukulele
    Antworten:
    8
    Aufrufe:
    1.467
  3. Qwert
    Antworten:
    7
    Aufrufe:
    1.197

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden