Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo folgendes Zitat aus dem PHP-Handbuch zum Thema "Datenbanksicherheit"

Escapen Sie jeden nicht numerischen Input, welcher zur Datenbank weitergereicht werden soll mit addslashes() oder addcslashes(). [...] Wie dieses Beispiel zeigt, sind in den statischen Teil der Abfrage eingebrachten Escapes nicht genug, und können leicht gehacked werden.

Kann mir das jemand näher erläutern? Wieso sind Zeichen wie \n in einem String in der Datenbank gefährlich?

Geschrieben

Die Zeichen selbst sind in der Datenbank nicht gefährlich, nur das direkte Übergeben von Benutzereingaben.

Wenn Du z.B. in einer SQL-Abfrage Hochkommatas zum Angeben von Feldwerten verwendest ( feld = '".$wert."'), dann dürfen keine ' in der Variable Wert vorkommen, da sonst die Grenzen des Wertes nicht mehr eindeutig sind...

Um dem abzuhelfen sollte man (bei mySQL z.B.) jeden vom Benutzer eingegeben String mit feld = '".mysql_escape_string($wert)."' in das SQL-Statement einbauen.

Im schlimmsten Fall ist es auch möglich so die SQL-Abfrage zu den Gunsten eines Angreifers abzuändern...

Edit: Ergänzungen und anschauliche Beispiele erwünscht :)

Geschrieben

aha, und wenn ich sowas habe:

mysql_query("SELECT * FROM Tabelle WHERE Name=" . $name);

oder:

mysql_query("INSERT INTO Tabelle(Name) VALUES(" . $name . ");

Geschrieben
mysql_query("INSERT INTO Tabelle(Name) VALUES(" . $name . ")";

Dann hat der "Angreifer" im schlimmsten Falle bei Name eingeben:

Michael); DELETE * FROM Name WHERE (1=1

Und deine Tabelle Name ist leer...wenn die SQL-Statements getrennt durch das ; auch beide ausgeführt werden...

Aber ich bezweifle, dass Dein Statement überhaupt funktioniert, da der String nicht Maskiert ist...

Edit: Neben der Verwendung von mysql_escape_string() ist es auch sehr ratsam, die Eingaben eines Benutzers selbst vor der Verarbeitung im Script zu überprüfen, z.B. mittels regulärer Ausdrücke...

Geschrieben
aha, und wenn ich sowas habe:

mysql_query("SELECT * FROM Tabelle WHERE Name=" . $name);

oder:

mysql_query("INSERT INTO Tabelle(Name) VALUES(" . $name . ");

Das kommt darauf an, woher du $name hast. Aber im allgemeinen schadet es nie einen String zu "escapen".

Geschrieben
Das kommt darauf an, woher du $name hast. Aber im allgemeinen schadet es nie einen String zu "escapen".

Sagen wir, dass der Name direkt vom Benutzer eingegeben wird. Dazwischen ist keine Validierung.

Geschrieben

ich habe das mal getestet. Konnte aber keine Fehlfunktion hervorrufen.

(php 5.0.3 & MySql 4.1.10)

Es wurde dann immer als Inhalt sowas wie "DELETE * FROM Tabelle"

als Text in der Datenbank gespeichert.

Geschrieben
ich habe das mal getestet. Konnte aber keine Fehlfunktion hervorrufen.

(php 5.0.3 & MySql 4.1.10)

Es wurde dann immer als Inhalt sowas wie "DELETE * FROM Tabelle"

als Text in der Datenbank gespeichert.

Falls man eine Einflussmöglichkeit auf die Datei php.ini hat, kann man auch den Schalter "magic_quotes_gpc = off" auf "magic_quotes_gpc = on" stellen.

aus der Wikipedia Seite

Das ist glaub ich standard, dass das an ist. (und dann geht das automatisch)

Zum Testen kannst du das ja mal ausschalten...

Und da du lieber davon ausgehen solltest, dass das mal aus sein kann, auch wenn es standard immer an ist, solltest du lieber eine Funktion um deinen String machen.

Geschrieben

also habe diese magic_quotes mal auf off gestellt.

Konnte bisher nur Fehlermeldungen erzeugen, aber keine 'bösen' Querys einspeisen. Hab folgenden PHP-Code:

mysql_query("INSERT INTO namen (name) VALUES('" . $_POST["name"] . "')",$db);

Hab in das html-Textfeld schon folgendes eingegeben:

Name'; DELETE * FROM namen

aber irgendwie scheint die Anwendung trotz Sicherheitslücke sicher zu sein, oder?

Geschrieben

Es hängt auch stark davon ab, wie die PHP-eigenen mySQL-Funktionen reagieren, sprich, ob sie mehrere Statements durch Semikolon getrennt ausführen...oder ob mySQL an sich das macht...

Aber spätestens, wenn Du mal eine Datenbankklasse von Dritten benutzt, die genau dieses zulässt, hast Du das Problem...

Geschrieben

Oder wenn du einen anderen Datenbankserver verwendest... Bei MySQL weiss ich, dass PHP mit der default Funktion mysql_query keine semikolongetrennte Statements zulässt.

Gruß,

Markus

Geschrieben

da fällt mir glatt noch etwas ein:

Wenn der String z.B. % enthält, hab ich auch ne größere Lücke, oder?

mysql_query("Delete Id, Name from Namen WHERE Name ='" . $name . "'");

wenn der $name == '%' habe ich ein Problem. Dann muss ich, wenn ich korrekt arbeiten will zusätzlich zu addslashes() auch noch solche Zeichen ersetzen z.B. mit regluären Ausdrücken?

Ich hoffe ich habe das jetzt verstanden.

Geschrieben

Die Funktionen mysql_escape_string() / addslashes() escapen nicht die mySQL-LIKE-Wildcards _ und %.

Diese musst Du händisch mit \ (default) oder dem jeweilig eingestellten ESCAPE-Zeichen escapen.

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...