Alexander (HH): (DBI)(CGI) Sql-Injektion vermeiden

Beitrag lesen

Moin Moin!

prepare() bzw. prepare_cached() mit Platzhaltern (Bind-Variablen), bevorzugt die Variante mit Fragezeichen. Steht lang und breit in der DBI-Doku.

Wenn die DB Platzhalter kann, beschleunigt das insbesondere prepare_cached() wahnsinnig. Quoting ist dann völlig unnötig, die Parmeter werden getrennt vom SQL-Statement an die DB übermittelt. Wenn die DB keine Platzhalter kann, kümmert sich DBI (genauer: das benutzte DBD-Modul) darum, dass die Platzhalter durch passend gequotete Werte ersetzt werden. Es ist mit dieser Methode also UNMÖGLICH, das Quoten zu vergessen. Mir ist auch keine Schwäche in dieser Richtung in irgendeinem DBD-Modul bekannt.

Was % und _ in LIKE angeht: Dafür gibt es eine Syntax, um diese Zeichen zu maskieren, damit sie ihre spezielle Funktion verlieren. Das ist aber (ohne jetzt nachzusehen) DB-spezifisch, typischerweise läuft das über ... LIKE '% mit 50% Aufschlag %' ESCAPING '' ... oder so ähnlich -- siehe DB-Handbuch.

Taint Mode einzuschalten schadet auch nicht (perl -T), und alle, wirklich alle Eingaben vom Benutzer validieren. Dabei erst alles verbieten und dann gezielt erlauben. (Also nicht in "verbotenen Zeichen" denken, sondern in "erlaubten Zeichen"). Typischerweise macht man das mit Regular Expressions, oder z.B. über Data::FormValidator.

Aufrufe externer Programme nach Möglichkeit vermeiden -- dazu gehört auch und insbesondere sendmail. grep, sed, awk und ähnliche können vollständig durch Perl-Funktionen ersetzt werden.

Alexander

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