• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

MySQL sichere Datenübergabe

Status
Für weitere Antworten geschlossen.

Nightmare

Neues Mitglied
Hi,

Da ich zurzeit ein bischen Zeit habe, bastel ich für meine Website das Gästebuch und die Gallery nach, damit ich nicht mehr die fertigen cms benutzen muss und die endlich mal vom Server fliegen können.

Jetzt habe ich von einem Kumpel gehört, das man MySQL über ein Eingabefeld wie bei einem Gästebuch knacken und platt machen kann. Da ich meinen Webspace mit jemandem zusammen benutze, habe ich da natürlich nicht viel Spaß drann, wenn irgendjemand auf die idee kommt unsere MySQL Daten zu löschen.

Kann mir jemand sagen, wie ich das sicher machen kann und wodrauf ich bei einer MySQLInjektion achten muss???
 
Eine weitere Möglichkeit das ganze noch sicherer zu machen ist die Verwendung von stored procedures. In Verbindung mit einer guten Vorbehandlung der Daten sind Injections sehr schwer zu realisieren.
Eine erste Maßnahme ist auf jeden Fall, alle Fehlerausgaben der Datenbank abzufangen damit keine Informationen an einen Möglichen Angreifer gelagen.
 
@morl
Wie kann ich das denn unterbinden???? Theoretisch kann man doch mit einem MySQL befehl die ausgabe in eine Tabelle geben, so das jemand z.b. im Gästebuch sieht, wie die tabellen heißen, oder sehe ich das falsch??? Ich bin mit MySQL noch sehr unvertraut....



Vielen Dank für die schnelle Antwort, doch habe ich noch eine Frage ich würde meiner Datenbank auch gerne mal eine Injektion verpassen (nicht soofort alles löschen oder so), nur damit ich weis, das das script funzt....

Wie mache ich das? und vorallendigen einigermaßen sicher...^^
 
Hier Das Beispiel vom Manual:
PHP:
  <?php
// Datenbankabfrage zur Ueberpruefung der Logindaten
$query = "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'";
mysql_query($query);

// Wir haben $_POST['password'] nicht geprueft, es koennte also alles darin
// stehen, was der User will. Zum Beispiel:
$_POST['username'] = 'aidan';
$_POST['password'] = "' OR ''='";

// Das bedeutet, der an MySQL gesendete Query wuerde sein:
echo $query;
?>
Die Abfrage, die an MySQL übermittelt wird:
SELECT * FROM users WHERE user='aidan' AND password='' OR ''=''
Dies würde jedermann erlauben, sich ohne valides Passwort einzuloggen.
 
Mal ein kleines Beispiel:

Denken wir uns ein Loginformular für einen geschützten Bereich mit 2 Feldern für Benutzername und Passwort.
Oft werden Parameter mit der URL übergeben oder der POST von einem Formular empfangen und vor den Senden an die Datenbank nicht korrekt für die Abfrage vorbereitet:
PHP:
"SELECT id, name FROM users WHERE login=' . $_POST['login'] . ' AND password=' . $_POST['password'] . ';"

Wenn wir jetzt folgendes in das login-Feld schreiben:
Code:
chris';/*
sieht die resultierende Anfrage an die Datenbank wie folgt aus:
Code:
SELECT id, name FROM users WHERE login='chris';/* AND password='';
Die Anfrage ist mit dem Semikolon abgeschlossen und alle Anweisungen nach dem Kommentarzeichen werden ignoriert. Die Datenbank schliesst den Kommentar automatisch am Schluss.

Mit etwas Geduld kann man sich so recht einfach Zugang zum geschützen Bereich verschaffen.
MySQL kann nur eine Aktion pro Abfrage verarbeiten was die Sache für mögliche Angreifer etwas erschert aber kein wirklich großes Hinderniss ist.

Das oben angegebene Beispiel ist noch recht harmlos. Man kann sich leicht vorstellen, das eine DELETE - Anweisung eingeschleust werden kann oder dank UNION alle möglichen Daten ausgespäht werden können.

Alleine die Vorbereitung der vom Formular erhaltenen Daten und das Quoten der Strings hilft hier schon einiges. Allerdings schützen gequotete Strings nicht vor den Kommentarzeichen.

Deshalb kommt hier die Verwendung von stored procedures ins Spiel. Man erlaubt damit nur ganz bestimmte Anfragen und somit ist eine Manipulation sehr schwer.

Zum Thema SQL-Injections gibt es aber im Netz sehr viele Informationen aber leider keine 100%ige Lösung.
 
Oh sorry Morl da warste nen bischen schneller...

Das mit dem Login ist auch nicht sooooooo interesant für mich, weil meine logins per schleife die Datenbank durchgehen und dann erst eine session registrieren, wenn eingegebener Username und Passwort mit einem Benutzer aus der Liste gleich ist...

Was viel interesanter ist, das jemand mit dem richtigen MySQL Befehl den er im GB eingibt die Datenbank "formatiert". Währe es da nicht einfacher, * ' / ; und , mit einem Array in die jeweiligen zeichencodes umzuwandeln? Z.B: & # 1 8 3 ;
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben