Formulare und deren Sicherheit

QUEST08

Erfahrenes Mitglied
Hallo an alle,

ich habe vor Jahren einmal gelesen, dass es möglich ist, über einfache Textfelder relativ "leicht" an die DB zu kommen, bzw. Daten auszulesen. Nun meine Frage, wenn ich ein Formular habe mit dem man z.B. private Nachrichten schreiben kann. Ist hier ein Zugriff auf die DB oder auf den Code möglich? Wie kann ich diesen unterbinden? Gerne würde ich den Nutzern eine möglichst große Zeichenpalette zu Verfügung stellen. Also auch z.B. $ [ ] § usw.!

Worauf kommt es da an? Wie kann ich verhindern, dass "fremder Code" eingebaut wird?

Ich hoffe ihr wisst was ich meine.

Liebe Grüße,
QUEST08
 
Das Stichwort hier ist SQL-Injection. Wenn Deine Queries User-Eingaben ungeprueft an die DB weiterreichen kann es durchaus sein dass jemand an Deine Datenbank kommt.
 
Du könntest die Befehle, die die Datenbank beeinflußen können rausfiltern. zB Update, Delete und was es da sonst noch gibt.

Die Sonderzeichen kannst du in HTML-Codes umwandeln, soweit ich weis werden die bei MySQL als normaler Text genommen.
 
Zuletzt bearbeitet:
Du könntest die Befehle, die die Datenbank beeinflußen können rausfiltern.
Bei Verwendung von mysql_real_escape_string() ist das vollkommen überflüssig, zumal es nicht nur eine Hand voll dieser "Befehle" gibt. Da kann man auch gleich noch Klammern, Kommata, Vergleichsoperatoren und was weiss ich nicht alles rausfiltern, somit können sich die User im Endeffekt nur noch Leerzeichen schicken. :D
 
Eine weitere Möglichkeit ist die Verwendung von Prepared Statements. Die Platzhalter werden über den Datenbanktreiber selbst in den gewünschten Typ übersetzt, was das manuelle Escapen überflüssig macht. In PHP bietet sich hierfür die Verwendung von [phpf]PDO[/phpf] an.
 
Oder gleich die modernere Form: MySQLi.

Bringt Prepared Statements mit und ist auch noch schneller als PDO

mysqli hat den Nachteil dass es nicht möglich ist, presistente Verbindungen zum DBMS aufzubauen.

Hier ein kleiner Überblick von vor und nachteilen von PDO und Mysqli
Quelle: http://www.pear-forum.de/fpost7573.html
PDO
Vorteile:
* Kann Exceptions werfen.
* Statement-Werte können sowohl an Variablen gebunden oder direkt ersetzt werden.
* Rückgabe der Daten nicht zwangsweise als String, ich wüsste nicht, dass die anderen das auch tun.
Nachteile:
* Hat wohl seltsame Angewohnheiten, wenn man nicht alle Datensätze ausliest und nicht closeCursor() aufruft.

mysqli
Vorteile: eigentlich keine besonderen
Nachteile:
* Nur MySQL - aber Unabhängigkeit vom DBMS ist mir nicht wirklich wichtig.
* Das Konzept, dass man nur Variablen an Statements binden kann, widerstrebt mir, denn wenn ich bspw. irgendwo das Ergebnis eines Funktionsaufrufes einsetzen will, muss ich den erst in eine Variable schreiben.

Hier noch ein Schöner Bericht / Tutorials zu PDO von PHP Magazin
http://it-republik.de/php/artikel/Daten(bank)abstraktion-mit-PHP-5.1-0742.html

Mfg Splasch
 
Zuletzt bearbeitet:
Der Vorteil von MySQLi ist wohl besonders, dass es um einiges performanter ist als PDO, da es den neuen mysqlnd verwendet und nicht wie PDO den alten mysqld.

Und ab PHP 5.3.0 (möge es bald kommen) kann MySQLi auch persistente Verbindungen nutzen.
 
Wenn man mit 5.3 auf persistente Verbindungen als Vorteil für mysqli setzt, sollte man auch die Möglichkeit nennen, das PDO mit mysqlnd als Standard SQL Driver kompiliert werden kann ;)

Installation on Unix
By default the MySQL database extensions are configured to use MySQL Client Library. In order to use the MySQL Native Driver, PHP needs to be built specifying that the MySQL database extensions are compiled with MySQL Native Driver support. This is done through configuration options prior to building the PHP source code.
For example, to build the MySQL extension, mysqli and PDO MYSQL using the MySQL Native Driver, the following command would be given:
./configure --with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
[other options]
Quelle: http://de.php.net/mysqli.mysqlnd

Gruss
 
Zurück