Für SQL-Injection verwundbares Prepared Statement

Hallo zusammen,

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

$stmt=$mysqli->query(„SELECT hauptsparte, untersparte, notiz FROM vertrag WHERE vertrag = ‚{$_SESSION[‚vertrag‘]}‘;“;

Gruß

Alex

Hallo Alex,

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

$stmt=$mysqli->query(„SELECT hauptsparte, untersparte,
notiz FROM vertrag WHERE vertrag = ‚{$_SESSION[‚vertrag‘]}‘;“;

Wo verwendest du denn hier prepared Statements?

http://www.php.net/manual/de/pdo.prepare.php

Gewöhn dir gleich an PDO zu verwenden, oder wenn du es noch einfacher und komfortabler haben möchtest doctrine http://www.doctrine-project.org/

Gruß XXD

Hallo,

ja so. Über die mysqli Schnittstelle.

http://php.net/manual/de/mysqli.prepare.php

Nur eben mit dem Unterschied, dass die Parameter direkt übergeben werden.

Ist das Prepared Statement also anfällig für eine SQL-Injection oder nicht?

Gruß

Hi,

Nur eben mit dem Unterschied, dass die Parameter direkt
übergeben werden.

Dann benutzt du kein Prepared Statement, das ist ja der Sinn davon Parameter eben nicht direkt zu übergeben.

$stmt = $mysqli-\>prepare("SELECT was FROM wo WHERE was=?")) {
$stmt-\>execute(array($vertrag));

Ist das … anfällig für eine
SQL-Injection oder nicht?

Ja

Ich kenn jetzt deinen Code bzw. Anwendung nicht, aber warum hälst du einen Vertrag in der Session?

Gruß XXD

Danke für die Antwort!

Ich verwende eine SESSION deshalb, weil ich nicht über Hiddenfelder oder GET arbeiten wollte und diese Kennung auf eine andere Seite mitnehmen musste.

Gruß

Hallo.

Du kannst es ganz einfach testen - lass Dir doch mal einen schadhaften Code mit übergeben.

Beispielsweise Vertragsnummer = „>0; delete from vertrag;“

Es gibt diverse Möglichkeiten, SQL Injections abzufangen - dazu frage mal den Suchdienstanbieter Deiner Wahl :wink:

Die SQL Injection geschieht nicht im Query selber. Du musst sicherstellen, dass du nur Queries ausführst, die du auch ausführen willst. Sprich: Du musst die Situation abfangen, dass dir jemand (z.b. über ein Formular) ein Query übergeben kann, welches du danach in deinem Code als „gewöhnlichen“ Parameter anschaust (z.b. die Vertragsnummer) und dynamisch zu einem Query zusammenbastelst - und ausführst.

Danke!
Hallo,

also muss im Prepared Statement jede Variable übergeben werden, damit es sicher ist.

Danke!

Hi,

also muss im Prepared Statement jede Variable übergeben
werden, damit es sicher ist.

…dem Platzhalter übergeben werden, ja. Damit übernimmt die Datenbank die Prüfung auf Gültigkeit.

Generell solltest du alle queries als prepared Statements machen (auch wenn keine Benutzereingabe vorliegt), da diese weniger Resourcen verbrauchen und meist schneller sind als Standardqueries.

Gruß XXD