Brei Geschrieben 14. Juni 2005 Teilen Geschrieben 14. Juni 2005 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Monty82 Geschrieben 14. Juni 2005 Teilen Geschrieben 14. Juni 2005 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jaraz Geschrieben 14. Juni 2005 Teilen Geschrieben 14. Juni 2005 Nicht die \n aber andere Sonderzeichen! Stichwort sql injection: http://de.wikipedia.org/wiki/SQL-Injection Gruß Jaraz Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Brei Geschrieben 14. Juni 2005 Autor Teilen Geschrieben 14. Juni 2005 aha, und wenn ich sowas habe: mysql_query("SELECT * FROM Tabelle WHERE Name=" . $name); oder: mysql_query("INSERT INTO Tabelle(Name) VALUES(" . $name . "); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Monty82 Geschrieben 14. Juni 2005 Teilen Geschrieben 14. Juni 2005 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... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 15. Juni 2005 Teilen Geschrieben 15. Juni 2005 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". Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Brei Geschrieben 15. Juni 2005 Autor Teilen Geschrieben 15. Juni 2005 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kills Geschrieben 15. Juni 2005 Teilen Geschrieben 15. Juni 2005 Sagen wir, dass der Name direkt vom Benutzer eingegeben wird. Dazwischen ist keine Validierung. siehe Post oben von Monty82 Gruß, Markus Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Brei Geschrieben 15. Juni 2005 Autor Teilen Geschrieben 15. Juni 2005 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 16. Juni 2005 Teilen Geschrieben 16. Juni 2005 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Brei Geschrieben 17. Juni 2005 Autor Teilen Geschrieben 17. Juni 2005 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kills Geschrieben 17. Juni 2005 Teilen Geschrieben 17. Juni 2005 Die Eingabe muss folgendermaßen lauten: Name'); DELETE FROM namen WHERE 1 = 1; INSERT INTO namen( 'name ungetestet! Gruß, Markus Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Monty82 Geschrieben 17. Juni 2005 Teilen Geschrieben 17. Juni 2005 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... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kills Geschrieben 17. Juni 2005 Teilen Geschrieben 17. Juni 2005 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Brei Geschrieben 22. Juni 2005 Autor Teilen Geschrieben 22. Juni 2005 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Monty82 Geschrieben 22. Juni 2005 Teilen Geschrieben 22. Juni 2005 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.