Alexander (HH): Frage zu Prepared Statement

Beitrag lesen

Moin Moin!

Genau deshalb frage ich, es heisst:

// Die Parameter für Prepared Statements müssen nicht maskiert werden. Der Treiber übernimmt das für Sie.

Leider steht nirgends geschrieben, wie dass mit den Usereingaben, egal woher sie kommen, aussieht.

Exakt so. Es sind Parameter für prepared Statements, egal woher sie kommen.

Es ist ja auch nicht schwer die Eingaben zu validieren,

$myquery = mysqli_real_escape_string($verbindung, $_GET['kategorie']);

Nur weiss ich nicht, ob dass jetzt doppelt escaped wird, dass wäre ja nicht erwünscht.

Wird es. Das Escapen übernimmt irgendwelcher C-Code hinter bind und execute, falls notwendig, oder idealerweise werden die Daten freundlicherweise getrennt vom SQL übertragen, so dass überhaupt kein Escaping notwendig ist, nicht einmal im C-Code.

dann prüfe das z.B. so (Perl-Syntax): $myquery=~/^\d+$/ or die "Hack mich nicht!";

Brauch ich ja nicht einmal, es geht nur um escapen.

Du mußt JEDE EINZELNE Benutzereingabe validieren. Validieren ist nicht Escapen. Validieren bedeutet, die Benutzereingabe auf Typ, Größe, Wert, Konsistenz zu prüfen. Wenn Du das konsequent machst, und zwar so paranoid wie möglich, dann ist ein Angriff über manipulierte Benutzereingaben schon einmal extrem schwierig. Was passiert, wenn $myquery zwar auf das Pattern /^\d+/ paßt, aber die Zahl, sagen wir mal, 100 Stellen hat? Was macht Dein Code dann?

Perls Taint-Mode ist in Sachen Eingabevalidierung extrem hilfreich, arbeitest Du mit unvalidierten Daten im Taint-Mode, fällst Du spätestens beim Zugriff auf Syscalls, Dateisystem oder Datenbank auf die Schnauze, sprich: das Programm wird beendet, bevor die unverifizierten Daten schaden anrichten können.

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".