Für SQL-Injection verwundbares Prepared Statement

exzel

SQL-Guru
Beiträge
170
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
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.702
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.
 

akretschmer

Datenbank-Guru
Beiträge
9.731
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

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

exzel

SQL-Guru
Beiträge
170
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ß
 

akretschmer

Datenbank-Guru
Beiträge
9.731
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ß

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.
 

exzel

SQL-Guru
Beiträge
170
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.
 

akretschmer

Datenbank-Guru
Beiträge
9.731
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.

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.
 
Werbung:
Oben