Wie schütze ich mich am besten vor SQL-Injektion?
Phil Z.
- datenbank
1 迪拉斯0 Olaf Schneider0 Phil Z.0 Olaf Schneider0 dedlfix
0 AllesMeins
0 Bio
Hallo.
Ich würde gerne mal in Erfahrung bringen, wie ich mich am besten gegen SQL-Injektions schütze?
Gibt es noch andere Methoden außer das eingeben von Sonderzeichen zu unterlassen d.h. wenn im Namen z.B. eins von den Zeichen /?!+<>=()&%$ eingegeben wird, das Skript abgebrochen wird (per if schleife) und eine Fehlermeldung ausgegeben wird?
mfg
Phil Z.
Hey,
Ich würde gerne mal in Erfahrung bringen, wie ich mich am besten gegen SQL-Injektions schütze?
mit Platzhaltern/Binding. Jede vernünftige Datenbankschnittstelle bietet das an. Blacklisting/Whitelisting/Escaping ist teils fehlerbehaftet, teils unbrauchbar, in jedem Fall die schlechtere Lösung.
http://search.cpan.org/~timb/DBI-1.52/DBI.pm#Placeholders_and_Bind_Values
http://pear.php.net/manual/en/package.database.db.intro-execute.php
Hat einer die Links für Python, Ruby, Java?
Hi.
mit Platzhaltern/Binding. Jede vernünftige Datenbankschnittstelle bietet das an. Blacklisting/Whitelisting/Escaping ist teils fehlerbehaftet, teils unbrauchbar, in jedem Fall die schlechtere Lösung.
Oh mein Gott -.- das wird ne Googlelei. Könntest du etwas erklären was es mit Platzhaltern/Bindings auf sich hat? Danke. =)
http://search.cpan.org/~timb/DBI-1.52/DBI.pm#Placeholders_and_Bind_Values
http://pear.php.net/manual/en/package.database.db.intro-execute.php
Na super^^ *sich das Wörterbuch raussuch*. Jetzt heißt es mal wieder übersetzen.
mfg
Philipp Zentner
das wird ne Googlelei.
Hab ich dir doch erspart mit den Deeplinks.
Könntest du etwas erklären was es mit Platzhaltern/Bindings auf sich hat?
Was genau? Die Codebeispiele sind meiner Meinung nach selbstsprechend.
Der Platzhalter ist meist ?, bei .NET @bezeichner.
Binding nennt sich der Vorgang.
Die Methoden heißen häufig prepare zum Vorbereiten des Datenbankhandles, execute zum Ausführen der Anfrage. Oft kann man mehrmals dieselbe Anfrage mit unterschiedlichen Platzhaltern ausführen und spart Rechenzeit im Vergleich zur Ausführung ohne Platzhalter.
HTH
das wird ne Googlelei.
Hab ich dir doch erspart mit den Deeplinks.
Ich meitne die Erklärung der Begriffe.
Könntest du etwas erklären was es mit Platzhaltern/Bindings auf sich hat?
Was genau? Die Codebeispiele sind meiner Meinung nach selbstsprechend.
Es geht ´mir darum mir erstmal zu erklären was überhaupt passiert.
Was wird überhaupt gemacht damit ich mich schützen kann. Was geht da vor sich?
Bisher sieht es für mich aus als würden willkürlich irgendwelche Felder mit ? gefüllt.
mfg
Phil Z.
Hallo Philipp,
http://search.cpan.org/~timb/DBI-1.52/DBI.pm#Placeholders_and_Bind_Values
http://pear.php.net/manual/en/package.database.db.intro-execute.php
Na super^^ *sich das Wörterbuch raussuch*. Jetzt heißt es mal wieder übersetzen.
Du hattest doch mal gefragt, welche Sprache Du als nächstes erlernen solltest. Ich empfehle Dir Englisch ...
Freundliche Grüße
Vinzenz, who couldn't resist :-)
Pfui Microsoft, bei euch allein hab ich doppelt so lange recherchiert wie für die restlichen Systeme zusammen!
http://www.python.org/dev/peps/pep-0249/ die Methode heißt .execute
http://ruby-dbi.rubyforge.org/ die Methoden heißen .prepare und .execute
http://java.sun.com/j2se/1.5.0/docs/api/java/sql/PreparedStatement.html
http://www.hibernate.org/hib_docs/v3/reference/en/html/objectstate.html#objectstate-querying-executing-parameters
http://msdn2.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare.aspx
So. Und wenn ich jetzt noch einen erwische, der's falsch macht, kriegt gleich eins hinter die Löffel! :)
hi,
mit Platzhaltern/Binding. Jede vernünftige Datenbankschnittstelle bietet das an. Blacklisting/Whitelisting/Escaping ist teils fehlerbehaftet, teils unbrauchbar, in jedem Fall die schlechtere Lösung.
Und welche Magie findet beim Binding statt, die die (bitte noch zu benennenden) Nachteile/Fehler des Escapings nicht hätte?
gruß,
wahsaga
Ich habe nie Magie gesagt. Intern wird mit Bedacht gequotet. Betrachte bitte das Gesamtbild.
① Escaping/Quoting kann man vergessen. Schussliger Code ohne funktioniert trotzdem in den meisten Fällen. Bei Binding braucht man zwangläufig ein prepare und ein bis mehrere execute. Eins geht ohne das andere nicht. Es gibt nichts, was man banal vergessen könnte.
② Der intuitive Ansatz (Blacklisting mit regulären Ausdrücken), wie im Ausgangsposting demonstriert, ist falsch. Das sollte schon aus dem Themenkreis Eingabevalidierung bekannt sein. Verlässt man sich auf Binding, macht man sich die Schlauheit der Leute, die wirklich Ahnung vom Thema haben, sprich tatsächlich den ISO-Standard durchgeackert und dazu Tests geschrieben haben, zu Nutze. Die Sache mit dem SELF hat auch ihre Schattenseiten, man darf das nicht aus den Augen verlieren.
③ Prepared Statements, wenn klug eingesetzt, gehen nicht so verschwenderisch mit der Rechenzeit für die Datenbank um wie normale Abfragen.
④ Die Links, die ich gegeben habe, führen zu Software, die Binding als Teil eines DB-Abstraktionslayers bietet. Ich fördere somit guten Stil, denn damit lässt sich datenbankübergreifend oder -neutral programmieren. Sollte der geneigte Programmierer eines Morgens aufwachen und merken, dass MySQL eine Spielzeugdatenbank ist, hält sich die Anpassung der Quellen ans bessere DBMS in Grenzen, im günstigsten Falle ohne Änderung.
Meine Aussage zum Thema des Threads steht.
echo $begrüßung;
http://pear.php.net/manual/en/package.database.db.intro-execute.php
Seit Version 5 bietet PHP die Platzhalter-Funktionalität auch selbst an. Man muss dazu nur auf die mysqli-Extension oder auf PDO wechseln. Man muss dabei auf "bind" in den Funktions- bzw. Methodennamen Ausschau halten und findet dann Anwendungsbeispiele im Handbuch.
echo "$verabschiedung $name";
Hallo Phil,
Ich würde gerne mal in Erfahrung bringen, wie ich mich am besten gegen SQL-Injektions schütze?
Das ist eine gute Idee!
Gibt es noch andere Methoden außer das eingeben von Sonderzeichen zu unterlassen d.h. wenn im Namen z.B. eins von den Zeichen /?!+<>=()&%$ eingegeben wird, [..]
Hiermit verbietest Du problemlose Zeichen (zum Beispiel +) und erlaubst gefährliche (zum Beispiel ").
Statt des Filterns kann man die „gefährlichen“ Zeichen escapen. Dann wird beispielsweise aus Stri"ng Stri"ng. Wenn Du uns verrätst, mit welcher Sprache Du auf welche Datenbank zugreifst, wird man Dir in diesem Punkt bestimmt weiterhelfen können.
das Skript abgebrochen wird (per if schleife) [..]
Nebenbemerkung: Eine if-Schleife gibt es nicht, da bei if nichts wiederholt wird.
Gruß
Olaf
Hi.
Hiermit verbietest Du problemlose Zeichen (zum Beispiel +) und erlaubst gefährliche (zum Beispiel ").
Ich weiß ich wollte jetzt nicht alle auflisten. Ich werde alle Sonderzeichen verbieten.
Statt des Filterns kann man die „gefährlichen“ Zeichen escapen. Dann wird beispielsweise aus Stri"ng Stri"ng. Wenn Du uns verrätst, mit welcher Sprache Du auf welche Datenbank zugreifst, wird man Dir in diesem Punkt bestimmt weiterhelfen können.
Ich benutze PHP.
das Skript abgebrochen wird (per if schleife) [..]
Nebenbemerkung: Eine if-Schleife gibt es nicht, da bei if nichts wiederholt wird.
Oh stimmt hast Recht -.-, hab schneller geschrieben als nachgedacht.
mfg
Philipp Z.
Hallo Philipp,
Ich weiß ich wollte jetzt nicht alle auflisten. Ich werde alle Sonderzeichen verbieten.
Da gibt es noch andere Möglichkeiten, und zwar …
Ich benutze PHP.
… aha, PHP und – lass mich raten – MySQL? Dann könnte Dir mysql_escape_string() oder mysql_real_escape_string() weiterhelfen.
Gruß
Olaf
echo $begrüßung;
… aha, PHP und – lass mich raten – MySQL? Dann könnte Dir mysql_escape_string() oder mysql_real_escape_string() weiterhelfen.
Die Verwendung der "real"-Variante ist zu bevorzugen, da die mysql_escape_string() wegen unzureichender Arbeitsweise mittlerweile missbilligt ist (siehe PHP-Handbuch zu beiden Funktionen).
echo "$verabschiedung $name";
Hi,
Ich weiß ich wollte jetzt nicht alle auflisten. Ich werde alle Sonderzeichen verbieten.
Definitiv der falsche Ansatz! Blacklists sind fast immer schlecht. Richtig müsste es heißen: Ich werde nur Buchstaben (oder nur Buchstaben und Zahlen) erlauben. Denn du kannst fast drauf wetten, das dir irgendwelche unbekannten Sonderzeichen durchrutschen.
Marc
Sup!
Kein SQL benutzen ;-)
Gruesse,
Bio