Verhindern von MySQL-Injections, Datenmanipulation und Co

Homepages, CMS, Templates, Web Based Programming, Webhosting, Gameserver

Moderatoren: coolmann, chillmensch

Benutzeravatar
schmidtsmikey
Site Admin
Beiträge: 8969
Registriert: 08.12.2003, 21:50
Wohnort: Hamburg
Kontaktdaten:

Verhindern von MySQL-Injections, Datenmanipulation und Co

Beitragvon schmidtsmikey » 16.03.2012, 15:26

Webseiten sind öffentlich und von überall erreichbar. Aus diesem Grund stehen sie auch im Fokus von Hackern, welche mittels unterschiedlichen Techniken Zugriff auf den Webserver oder die Datenbank erreichen möchten. Eine solche Technik sind SQL-Injections, sprich gezielte Zeichenketten, um Datenbank-Manipulationen durchzuführen. Vor allem Formulare, Sortier- und Filterfunktionen sind gefährdet, da hier Leser eigene Werte an das Skript und letztendlich an die Datenbank übergeben. Eine potentielle Angriffsfläche für Hacker!

Aus diesem Grund ist es eine Hauptaufgabe für Webentwickler, solche Formulare möglichst sicher zu programmieren. Vertraue nie Werten, die über Formulare hereinkommen! In dem folgenden Artikel werden die Gefahren durch SQL-Injections erläutert und gleichzeitig Schutzmaßnahmen dargestellt:

MySQL/PHP-Skripte absichern und schützen - Verhindern von MySQL-Injections, Datenmanipulation & Co.

An dieser Stelle sei erwähnt, dass Verbesserungsvorschläge, Tipps und Kritik gerne erwünscht sind.

Benutzeravatar
schmidtsmikey
Site Admin
Beiträge: 8969
Registriert: 08.12.2003, 21:50
Wohnort: Hamburg
Kontaktdaten:

Re: Verhindern von MySQL-Injections, Datenmanipulation & Co.

Beitragvon schmidtsmikey » 16.03.2012, 15:31

Wäre super, wenn hier eine Diskussion entstehen könnte, wie man die Sicherheit weiter erhöhen kann. Danke!

Benutzeravatar
chillmensch
Beiträge: 1935
Registriert: 09.03.2004, 15:49
Wohnort: Kiel
Kontaktdaten:

Re: Verhindern von MySQL-Injections, Datenmanipulation und C

Beitragvon chillmensch » 20.04.2013, 16:27

Ich weiß nicht, ob es in PHP einen ähnlichen Mechanismus gibt, aber in Java existieren "Named Queries". Dabei werden die Queries zunächst mit Platzhaltern definiert. Die ersetzten Platzhalter werden dann vom entsprechenden Framework automatisch "entschärft". Das könnte z.B. so aussehen:

Code: Alles auswählen

Query query = createNamedQuery("SELECT * FROM users WHERE username = :username AND password = :password", User.class);
query.setString("username", "IrgendeinName");
query.setString("password", "IrgendeinGehashtesPasswort");
User user = query.uniqueResult();


Die Platzhalter werden dann in der Regel automatisch gequotet und von einfachen Hochkommata umklammert, sodass Platzhalter i.d.R. nur als Filterkriterien (WHERE) verwendet werden können. Damit z.B. auch ORDER BY oder LIMIT Angaben eingesetzt werden können, gibt es entweder spezielle Funktionalitäten dafür, oder die Platzhalter müssen anders deklariert werden (z.B. durch einvorangestelltes #-Zeichen statt eines Doppelpunkts). Im letzteren Fall muss man sich jedoch selber um das Absichern gegen SQL Injections kümmern.

Aufgrund der statischen Typisierung von Java ist dies zumindest für das LIMIT recht einfach. So kann ein nicht numerischer Wert (der z.B. Manipuliert vom Frontend kommt) nicht in eine Zahl umgewandelt werden. Für alphanumerische Werte (z.B. für ORDER BY) kann eine enum definiert werden. Auch hier schlägt die Umwandlung fehl, wenn ein unbekannter Wert vom Frontend umgewandelt werden soll.

Ich denke, das reicht als kleine Einleitung ;)
Besucht doch auch mal meine persönliche Webseite
Mein letztes Projekt: Fahrschule Kiel


Zurück zu „Webseiten, Webprogrammierung & Domains“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste