Portal > Foren > PHP > PHP-Programmierung > SQL-Befehle aus String entfernen (Schutz vor MySQL-Injection)
Antwort
 
Themen-Optionen
Alt 11.09.2006, 12:07 Nach oben    #1
Neuer Benutzer
 
Registriert seit: 12.01.2006
Beiträge: 21
Standard SQL-Befehle aus String entfernen (Schutz vor MySQL-Injection)

Hi @ all!
Ich bin gerade dabei etwas zu entwickeln um meine $_POST und $_GET-Variablen global zu sichern. Via addslashes() und mysql_real_escae_string werden sie bereits gesichert, aber gegen erweiterte MySQL-Injektion ist mein Script immer noch nicht imun.
Nun wollte ich Fragen wie ich SQL-Befehle aus einem String entfernen kann. Gibt es dafür eine Funktion oder muss ich alle SQL-Befhle selber auflisten und entfernen? Welche SQL-Befehle sollten auf jeden Fall entfernt werden?
Und was sollte ich noch aus meinen $_POST/$_GETs entfernen?
Ich übergebe in meinem Script lediglich Integer und String-Werte ohne irgenwelche Sonderzeichen.

Danke für Hilfe!
MFG Pain-maker
Pain-maker ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.09.2006, 12:25 Nach oben    #2
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Wieso langt dir mysql_real_escape_string nicht? Das escaped doch alle Anführungszeichen. Befehle werden dadurch doch ausgeschlossen, vorausgesetzt deine auführenden MySQL-Queries sind sauber programmiert..
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.09.2006, 13:01 Nach oben    #3
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 826
Standard

Zitat:
Zitat von Pain-maker Beitrag anzeigen
Ich bin gerade dabei etwas zu entwickeln um meine $_POST und $_GET-Variablen global zu sichern.
Mener Meinung nach eine verkehrte Herangehensweise. Klar, du schreibst weiter:

Zitat:
Ich übergebe in meinem Script lediglich Integer und String-Werte ohne irgenwelche Sonderzeichen.
Aber dir hier pauschal erstmal alles rauszulöschen, was nicht in ^[a-9A-Z0-9]*$ oder so ähnlich passt, ist doch Käse. Später soll vielleicht doch mal ein Umlait, ein Apostroph oder sonstwas eingegeben werden und dann?

magic_quotes.gpc ist übrigens schon so ein missratener Versuch, Skripte pauschal vor Injections zu schützen.

Meine Herangehensweise ist die, magic_quotes.gpg ggf. erstmal rückgängig zu machen und dann die Werte je nach Bedarf zu prüfen oder filtern.

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.09.2006, 13:41 Nach oben    #4
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.180
Standard

-> http://thedailywtf.com/forums/thread/73098.aspx
mal lesen
robo47 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.09.2006, 14:22 Nach oben    #5
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 826
Standard

Zitat:
Zitat von robo47 Beitrag anzeigen


Sehr geil! LOL...

Basti
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.09.2006, 14:55 Nach oben    #6
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.642
Standard

hehe immer wieder gerne zu lesen.
Zitat:
Wieso langt dir mysql_real_escape_string nicht? Das escaped doch alle Anführungszeichen. Befehle werden dadurch doch ausgeschlossen, vorausgesetzt deine auführenden MySQL-Queries sind sauber programmiert..
Vielleicht sollteste du kurz sagen, was du unter "saubere Queries" verstehst.
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.09.2006, 14:59 Nach oben    #7
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
Vielleicht sollteste du kurz sagen, was du unter "saubere Queries" verstehst.
Naja unter sauberen Queries versteh ich, dass man u.a. mit den Anführungszeichen (') arbeitet. Hatte schonmal einen Fall erlebt, in dem ein "Kunde" seine Queries etwa so gestaltete:
Code:
SELECT spalte FROM tabelle WHERE username = test
Unglücklich war dabei, dass der Query auch so funktionierte (weiß nicht, welche MySQL Version). Nu, das "test" holte er sich allerdings aus der superglobalen $_GET .. In diesem FAll war es wirklich ein leichtes, eine SQLInjection durchzuführen, da nichteinmal hochkommas benutzt werden mussten.
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.09.2006, 16:07 Nach oben    #8
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

magic_quotes_gpd, magic_quotes_runtime und magic_quotes_sybase ausmachen und über jeden Wert, der in einen Query reinsoll, mysql_real_escape_string() drüberrutschen lassen.
Das reicht. Wie soll man denn von außen jetzt noch ine Query reinkommen? Gar nicht, jedenfalls nicht ohne Shellzugang.
__________________
Gedanken aus Draht stricken einen Zaun.
Lars ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.09.2006, 18:02 Nach oben    #9
Neuer Benutzer
 
Registriert seit: 12.01.2006
Beiträge: 21
Standard

Erstmal danke zu den zahlreichen Beiträgen!

Nun die aktuelle Ausgabe von PHP Solutions erklärt ausführlich wie es z.B. durch Binärzahlen oder Kommentierung möglich ist trotzdem eine Injektion durchzuführen. Das ist dann eben eine erweiterte Injektion. Deswegen dachte ich mir das es wohl am Besten wäre einfach $_POST/$_GET auf MySQL-Befehle zu überprüfen und diese ggf zu entfernen oder eine Fehlermeldung auszuspucken.
Ich würde nun mal einfach gerne einen Weg finden um mittels einer Funktion einfach meine Globals zu sichern ohne jeden einzelnen Wert zu überprüfen.
Könnte mir jemand eventuell erklären warum mein Ansatz mit den Befehlen so falsch ist?

MFG Pain-maker
Pain-maker ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.09.2006, 18:54 Nach oben    #10
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 826
Standard

Zitat:
Zitat von Pain-maker Beitrag anzeigen
Nun die aktuelle Ausgabe von PHP Solutions erklärt ausführlich wie es z.B. durch Binärzahlen oder Kommentierung möglich ist trotzdem eine Injektion durchzuführen.
Gib uns mal ein Beispiel und wie sich das laut phpsolmag absichern lässt.

Zitat:
Das ist dann eben eine erweiterte Injektion.
Wer hat diesen Begriff wo etabliert?

Zitat:
Deswegen dachte ich mir das es wohl am Besten wäre einfach $_POST/$_GET auf MySQL-Befehle zu überprüfen und diese ggf zu entfernen oder eine Fehlermeldung auszuspucken.
Dann schau dir doch mal den amüsanten WTF-Thread an, der oben verlinkt ist.

Zitat:
Ich würde nun mal einfach gerne einen Weg finden um mittels einer Funktion einfach meine Globals zu sichern ohne jeden einzelnen Wert zu überprüfen.
Könnte mir jemand eventuell erklären warum mein Ansatz mit den Befehlen so falsch ist?
Ich kanns probieren:
Klar, wenn du weißt, deine gesamte Anwendung erwartet ausschließlich Werte, die auf oben genannten PCRE-Pattern passen, dann mach das so.

Nur bist du damit eben exrem eingeschränkt. Damit kannst du z.B. nichts anbieten, wo ein Benutzer mal einen "normalen" Text eingibt, sei es auch nur die Bezeichnung für eine neu einzugenbende Ressource oder was auch immer. Ich tu mich schwer, mit eine Anwendung vorstellen, bei der es keine solche Eingaben gäbe die aber dennoch groß genug wären, um sich über sowas hier überhaupt Gedanken zu machen.

Auch legst du mit der Art der Prüfung/Filterung pauschal fest, was hinterher mit den Daten passieren soll (so in etwa zumindest). Wenn du also z.B. Daten in eine MySql-DB packst und pauschal alle Werte durch mysql_real_escape_string() jagst fällt dir vielleicht hinterher ein, dass einige der Daten doch besser in Dateien untergebracht werden, dass Webservices angesprochen werden sollen etc. und dise Systeme haben dann wieder ganz andere Kriterien, wie gefiltert werden muss.

Den Filter kannst da dann auch nicht einfach nur enger ziehen, auf den kleinsten gemeinsamen Nenner sozusagen, da du dann ja womöglich bereits unter anderen Kriterien gespeicherte Datensätze nicht mehr ansprechen kannst.

Es ist einfach ein Wert, in der Anwendung auf exakt das zugreifen und reagieren zu können, was der Benutzer (etc.) übergeben hat, den ich mir nicht nehmen lassen würde - eben, weil es dich extrem einschränkt, gerade, was die Erweiterung deiner Anwendung angeht.

Dann schreibst du "meine Globals zu sichern". Abgesehen davon, dass die keinen Schutz brauchen (*g In der Regel ist es Sinnig, mit Request-Objekten zu arbeiten. Einmal eben, um diesen ggf. magic_quotes-Quatsch zentral zu entfernen, dann um die Werte nicht schreibbar zu machen und, mitunter macht es Sinn, dass nicht alle Teile der Anwendung Zugang zu diesen Daten haben, sondern nur die Teile, die die Eingaben eben auswerten und verarbeiten müssen.

Ja, und einzeln überprüfen musst du die Werte noch lange nicht. In der Regel liegen die doch als Array vor und so lässt du die Escaping-Funktion einfach in der query-Methode deiner Datenbank-Klasse drübelaufen (oder entsprechendes eben). Das gleiche machst du ja z.B. sicher auch bei der Ausgabe der Daten in HTML-Seiten, ohne deshalb gleich alle Werte als Html-Entities in die Datenbank zu schreiben oder im anderen Extrem, eben auch jeden Wert einzeln umkodierst.

Basti

Geändert von Basti (11.09.2006 um 18:58 Uhr).
Basti ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Problem bei Verarbeitung von Templates (Eigene Klassen) dago PHP-Programmierung 21 31.08.2006 16:02
Datei einlesen. cyberdevil87 Allgemeine Java-Programmierung 3 27.06.2005 09:22


Alle Zeitangaben in WEZ +2. Es ist jetzt 11:10 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44