phpbar.de logo

Mailinglisten-Archive

[php] sichere MySQL Queries

[php] sichere MySQL Queries

Lutz Zetzsche Lutz.Zetzsche at sea-rescue.de
Don Nov 9 17:14:37 CET 2006


Hallo AA,

Am Donnerstag, 9. November 2006 16:36 schrieb AA:
> gravierender denkfehler? hast du schonmal versucht den typ int über
> ein formular zu versenden? alles was darüber ankommt ist vom typ
> "string" und muss entsprechend gecastet und/oder geprüft werden vor
> der speicherung.

in der Theorie ja. :-) In der Praxis gibt es aber das Type-Juggling von 
PHP, und ich wette, daß viele sich daher nicht bewußt mit dem Casting 
beschäftigen. Das habe ich am Anfang auch nicht gemacht... ;-) Und der 
Haken ist eben: Das Formular sendet die Daten als Zeichenkette - und im 
Query-String werden sie im Prinzip auch als Zeichenkette eingebaut. 
Wenn jemand in PHP dazwischen nicht prüft und castet, fällt das eben 
nicht weiter auf.

> und wenn ich ein integer in die datenbank einfüge, dann füge ich ein
> integer ein und keinen string, den ich escapen muss.

Gut, ich verwende ja Prepared Statements, alternativ könnte man auch mit 
sprintf() arbeiten - diesen Klasse-Tip habe ich mal hier auf der Liste 
aufgeschnappt :-) -, aber in irgendeiner Form behandele ich immer auch 
die Zahlenwerte - auch wenn das dumm klingen mag. Es kann nämlich 
trotzallem sein, daß irgendwo etwas durchrutscht. Spätestens dort, wo 
ich dann "escape", sprintf() oder Prepared Statements verwende, wird 
das Ganze dann aber auf die eine oder ander Weise abgefangen.

> bei meinen 
> ausführungen wolle ich keine abhandlung über typen schreiben oder ein
> anfängerhandbuch, sondern habe mich darauf verlassen, dass die
> mitlesenden sehr wohl zwischen einem string und int o.ä.
> unterscheiden können. 

Da hier auch viele Anfänger auf der Liste sind, Anfänger das oft noch 
nicht können - das konnte ich als Anfänger auch nicht -, finde ich es 
wichtig, daß man diese Details nicht ganz wegläßt. So haben Anfänger 
eine bessere Chance, durch das Mitlesen auf der Liste schneller zu 
lernen. Das ist aber nur meine persönliche Meinung. :-)

> zu deinen bemerkungen bezügl. prepared statements:
> --------------------------------------------------
> ich wollte dir mit meinem hinweis keinesfalls auf die füsse treten.

Bist Du auch nicht. :-) Alles im tiefgrünen Bereich. ;-)

> ich bezog mich auf prepared statement anweisungen der
> mysqli-erweiterung. das wurde ja hier erwähnt als möglichkeit.
> ich meine, es ist gestattet, darauf hinzuweisen, dass dies keine
> wirkliche lösung ist, sondern für den einzelfall ausreichend.

Dann bezieht sich der Einwand aber auf die Verwendung der 
MySQLi-Erweiterung und richtet sich nicht gegen die Verwendung von 
Prepared Statements, wenn ich Dich jetzt richtig verstehe. ;-)

> wer 
> heute komplexe anwendungen basierend auf der mysqli-erweiterung
> schreibt (zb. ich *g*), der wird es morgen schwer haben, dies mal
> eben zu portieren, weil eben einige mysqli-anweisungen so speziell
> auf mysql zugeschnitten sind, dass man das nicht eben mal so
> austauschen kann. auch nicht mit PDO (siehe zb. mysqli_field_seek()
> u.v.a. spielereien, die ich nicht missen möchte).

Ok, klar. Ich hatte hier auch mal eine Diskussion zur Portabilität 
angestoßen, und da kam von einem Teilnehmer der letztendlich 
zutreffende Einwand, daß man sich irgendwo auch mal festlegen müsse. 
Wenn man mit PHP programmiere, wäre das ja auch so eine Entscheidung. 
Und ich finde, da ist etwas sehr Wahres dran.

Es gibt mit Sicherheit Anwendungen, die möglichst portabel sein sollten, 
was die Datenbank angeht, ich würde aber mal sagen, daß die meisten 
PHP-Anwendungen eine MySQL-Datenbank verwenden und das auch so bleiben 
wird. Ich habe mir auch jahrelang darüber den Kopf zerbrochen, was 
wäre, wenn ich für meine Website mal eine andere Datenbank verwenden 
wollte. Naja, die Erfahrung ist, ich habe meine Website schon ein paar 
Mal komplett neuprogrammiert. Geblieben ist nur die Datenbank: 
MySQL... ;-)

Im Übrigen ist es so, daß wenn man seine Datenbank-Funktionen vernünftig 
kapselt, sogar problemlos die Datenbank-Erweiterung austauschen 
kann... ;-)

> es ist müssig, darüber zu diskutieren, welches die *beste* variante
> ist. es gibt nämlich keine. nur eben grundsätze, die zu beachten
> sind.

Genau. :-)

Viele Grüße
Lutz

php::bar PHP Wiki   -   Listenarchive