Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[PHP] Datenbanksicherheit bei Strings

Empfohlene Antworten

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?

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 :)

aha, und wenn ich sowas habe:

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

oder:

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

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...

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".

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.

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

siehe Post oben von Monty82

Gruß,

Markus

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.

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.

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?

Die Eingabe muss folgendermaßen lauten:


Name'); DELETE FROM namen WHERE 1 = 1; INSERT INTO namen( 'name

ungetestet!

Gruß,

Markus

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...

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

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.

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.