$mysqli->real_escape_string auch bei SELECT eines neutralen Datensatzes

Hallo zusammen,

ist es notwendig bei einer SELECT Anweisung die Variablen mit $mysqli->real_escape_string zu maskieren, wenn es sich nicht um Logindaten etc. handelt?

In diesem Beispiel ist klar, dass die Maskierung notwendig ist.

$query = „SELECT * FROM users WHERE user=’{$_POST[‚username‘]}’ AND password=’{$_POST[‚password‘]}’“;

Aber wie ist es bei einem SELECT eines Kunden oder Vertrages.

$query = „SELECT * FROM vertraege WHERE id_vertrag = ‚{$_POST[‚id_vertrag‘]}‘ AND benutzer = ‚{$_POST[‚username‘]}‘“;

Besteht hier Gefahr einer SQL-Injection?

Gruß und Dank!

ja, sql-injections sind unabhängig vom query möglich.

Auch ein

$\_POST['id\_vertrag'] = " '; DELETE \* FROM users; --";

wäre in dem Fall Extrem böse :wink:

Gruß

Hallo und danke für die schnelle Antwort,

da stellen sich für mich gleich noch zwei Fragen.

Zuerst die Injection selbst.

$_POST[‚id_vertrag‘] = " '; DELETE * FROM users; --";

Ich verstehe die Struktur dieser Anweisung nicht. Den Befehl DELETE * FROM users schon aber das einfache Anführungszeichen, die Semikolon und die zwei Striche zum Schluss nicht.

Und noch eine allgemeine Frage. Ist eine SQL-Injection nur in einem Eingabefeld möglich oder geht das auch über HTML-Auswahllisten? Angenommen ein Kunde und dessen Verträge werden über Auswahllisten gewählt. Ist dann eine Injection möglich?

Gruß und Dank!

mit " '; " wird der vorherige befehl abgeschloßen
mit – wird alles in dieser zeile was nach dem – kommt auskommentiert.

eine SQL Injection ist immer dann möglich wenn Eingaben von außen kommen.

Grundsätzlich bei jeder $_POST, $_GET, $_COOKIE variable.
Ich würde aber Grundsätzlich eh jede Eingabe in mein Query Validieren und Escapen.

Grundsätzlich macht es eh Sinn Prepared Statements zu nutzen.

http://de.wikipedia.org/wiki/Prepared_Statement

Gruß

Hallo,

also ich habe versucht den ursprünglichen Befehl

$query = „SELECT * FROM vertraege WHERE id_vertrag = ‚{$_POST[‚id_vertrag‘]}‘ AND benutzer = ‚{$_POST[‚username‘]}‘“;

Dann so umzuschreiben, dass er zur SQL-Injection wird.

Sieht dann bei mir so aus.

$query = "SELECT * FROM vertraege WHERE id_vertrag = ‚{$_POST[‚id_vertrag‘]}‘ = "; „DELETE * FROM users; --“;

Ist das so korrekt?

Denn die Zeile

$_POST[‚id_vertrag‘] = " '; DELETE * FROM users; --";

aus dem vorherigen Beitrag konnte ich so 1 zu 1 nicht unterbringen

Gruß

Alex

was willst du da machen?

Mir ging es rein um die Schreibweise. Ich will dann einfach genau wissen, wo ich überall Semikolon etc. machen muss.

Bin noch Anfänger.

Hallo Alex,

grundsaetzlich sollte man ALLE Variablen, die in einem Datenbanstatement verwendet werden, escapen.
So ziemlich ueberall, wo man eine Variable mit Inhalt benutzt, den man nicht 100%ig selbst kontrolliert (GET, POST, Cookie, Datenbankinhalte, …) haben potentielle Angreifer (auch wenn sie sich dessen evtl. nicht selbst bewusst sind das sie etwas schaedliches tun) die Moeglichkeit deine Datenbank anzugreifen.

Das ist mit den normalen MySQL-PHP-Funktionen recht umstaendlich. Einfacher wird es wenn man z.B. PDO einsetzt, die einem das Escapen wesentlich vereinfachen.

Beispiel:

$query = $db-\>prepare("SELECT \* FROM vertraege WHERE id\_vertrag = :contract\_id AND benutzer = :username");
$query-\>bindParam(":contract\_id", $\_POST['id\_vertrag']);
$query-\>bindParam(":username", $\_POST['username']);
$query-\>execute();
foreach($query-\>fetch(PDO::FETCH\_ASSOC) as $row) {
 echo $row["contract\_subject"];
}

Noch einfacher wird es wenn man seine Datenbankabfragen mit einem kompletten Abstraktionslayer durchfuehrt, evtl. sogar mit einem starken Framework im Hintergrund.

Gruss
Stefan

Hallo und danke für die Antworten!

Aber in einer Auswahhliste ist eine SQL-Injection schwieriger als bei einer einem normalen Textfeld, oder?

Gruß

Aber in einer Auswahhliste ist eine SQL-Injection schwieriger als bei einer
einem normalen Textfeld, oder?

Der Mehraufwand ist minimal. Die dafuer notwendigen Hilfsmittel sind mittlerweile in jedem Browser eingebaut (Firebug, Chrome Developer Tools, …)
Wie gesagt: man sollte moeglichst immer alles Escapen.

Szenario: ein Mitbewerber/Konkurent ueberredet einen Kunden das er ihm seine Logindaten ueberlaesst („um sich nur mal was anzusehen“) und schwups sind deine Daten weg.