kostenloser Webspace werbefrei: lima-city


sql injection verhindern

lima-cityForumDie eigene HomepageSicherheit im Internet

  1. Autor dieses Themas

    l****m

    Hallo Leute,

    ich habe im Internet bereits versucht, mich zu diesem Thema schlau zu machen: leider ohne besonderen Erfolg.
    Es gibt zwar viel zu diesem Thema, aber nichts wirklich verständliches.

    Soweit ich mir angelesen habe, soll es sehr einfach sein, über eingabefelder die mysql-datenbank zu hacken.
    Wie kann man als anfänger am einfachsten das verhindern?

    Danke schon mal im Vorraus, dass ihr diese blöde Frage von mir beantwortet...
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. m**********n

    Eine MySQL-Injection geht beispielsweise so: ' OR 1=1 --
    Du musst in deinem PHP-Code einfach auf möglichen SQL-Code prüfen. Aber an deiner Seite ging die ' OR 1=1 -- Injection nicht.
  4. Autor dieses Themas

    l****m

    Ich bin ein wenig erstaunt, da ich bei meinem code nicht vorher aus SQL-Code überprüfe...

    // MySQL-Statement
    $sql = "SELECT Name FROM User WHERE Name = '".$_POST['name']."' AND Passwort = '".$_POST['kennwort']."'";
    // Anfrage an DB-Server
    $ergebnis = mysql_query($sql);
    $data = mysql_fetch_array($ergebnis);
    if($data[Name] != null)
    {
    ...
    }  
    else
    {
    print("Name und Passwort passen nicht zusammen!<br />");
    }
  5. g****e

    Hmm. Das ist im Moment ein Thema was ich auf meinem Blog zu schreibe, wie man diese Injections umgeht mit hilfe von Prepared Statements unter MySQLi.

    Doch erstmal zu den Injections: http://basti.4ym.org/478
    Das ist der Blog eines Kumpels, ein echtes Genie für Websprachen wie ich finde^^ Dort stehen auch schon 2 Methoden mit denen du SQL-Injections umgehen kannst: richtig escapen und Value-Binding mittels PDO. Dazu muss man sagen, dass das erste ganz Ok ist, und PDO an sich etwas, das man nicht zwingend einem "Neuling" zumuten möchte. Es ist an sich eine super Abtrahierung von Datenbanknutzung, doch ich finde für den Anfang wäre es mit MySQLi leichter (ist theoretisch das selbe, praktisch nicht^^).

    Um Injections zu verhindern google am besten mal nach "prepared statements PHP", und da findest du megaviel. Vllt sogar direkt nach MySQLi oder PDO googln, Objektorientierung wird aber vorrausgesetzt. Sonst mach es auf die escapingart wie basti es macht ;-)

    Liebe Grüße
  6. Autor dieses Themas

    l****m

    danke für den tipp,
    kannst du mir zufällig erklären, warum dann bei meinem code das sql injection nicht funktioniert... ich meine, ist ja gut so, interessieren würde es mich aber trotzdem...
  7. Kannst du mir mal einen Link zu der Seite schicken?
    Ich kann mir nicht vorstellen, dass es nicht geht ;)

    mysql_real_escape_string ist oder eher sollte Standard sein,
    dann ist einiges abgedeckelt.

    Viel Lesestoff gibts dazu übrigens über Google zu finden :D
    http://www.google.de/#q=sql+injection+php
    http://www.google.de/#q=sql+injection+php+verhindern

    Beitrag zuletzt geändert: 27.4.2011 10:19:54 von sneppa
  8. Autor dieses Themas

    l****m

    Meine Seite findest du hier:
    http://lordam.lima-city.de
  9. lordam schrieb:
    Meine Seite findest du hier:
    http://lordam.lima-city.de

    Das ist auch das oben genannte Login?
    Ah stimmt, alles klar.

    Was auch immer gut ist: Nie Fehlermeldungen ausgeben.

    Das mysql_real_escape_string hast du anscheinend schon drin oder wie?

    Beitrag zuletzt geändert: 27.4.2011 10:33:04 von sneppa
  10. Autor dieses Themas

    l****m

    sneppa schrieb:
    Was auch immer gut ist: Nie Fehlermeldungen ausgeben.


    Dann würde sich der Nutzer ja wundern, wenn nichts passiert, falls er sich vertippt hat...
  11. lordam schrieb:
    sneppa schrieb:
    Was auch immer gut ist: Nie Fehlermeldungen ausgeben.


    Dann würde sich der Nutzer ja wundern, wenn nichts passiert, falls er sich vertippt hat...

    Das ist auch in Ordnung, Aussagen wie Benutzer nicht gefunden etc bringen einen Eindringling nicht weiter.
    Aber niemals MySQL Fehlermeldungen oder ähnliches auf dem Bildschirm ausgeben.
  12. Autor dieses Themas

    l****m

    sneppa schrieb:
    Das mysql_real_escape_string hast du anscheinend schon drin oder wie?


    Ich habe nur den Code drin, der oben steht... und da ich das mysql_real_escape_string nicht mal kenne, habe ich das bestimmt nicht drin ^^
  13. christian1603

    Kostenloser Webspace von christian1603

    christian1603 hat kostenlosen Webspace.

    Hey,
    wenn ich das jetzt/und früher richtig versanden habe funktioniert sql injection bei MySQL_real_escape_string nicht/garnicht.
    Also bin ich so auf der sicheren seite? Reicht das wirklich?


    Da hier schon das Thema Fehler aufgetreten ist wollte ich fragen ob es sinnvoll ist error_reporting(0); einzubauen. Was spricht dagegen, außer das man evt. Fehler nicht mitbekommt?

    LG


    PS:
    lordam, ich hoffe ich klau dir dein Thema nicht.
  14. christian1603 schrieb:
    Hey,
    wenn ich das jetzt/und früher richtig versanden habe funktioniert sql injection bei MySQL_real_escape_string nicht/garnicht.
    Also bin ich so auf der sicheren seite? Reicht das wirklich?

    Kommt drauf an, es sollte eigentlich verhindert sein, wenn du alle Eingaben vom Benutzer mit den Hochkommas umklammerst.

    Es wäre ohne Hochkommas bei Zahlen noch möglich zu injezieren:
    SELECT name, passwort FROM users WHERE iduser = $id

    Wenn man für $id bspw 0 OR 1 == 1 einsetzt würde man die kompletten Daten aller User bekommen.
    Mit Hochkommas wäre das nicht passiert und escapen.

    Man sollte sich auch nie auf die Eingabe des Nutzers verlassen.
    Auch Selectboxen könnten einfach manipuliert werden und mit anderen Werten als bspw. Zahlen gefüttert werden.

    Beim Eintragen eben immer schauen, ob es auch ein int ist, wo ein int rein soll.

    christian1603 schrieb:
    Da hier schon das Thema Fehler aufgetreten ist wollte ich fragen ob es sinnvoll ist error_reporting(0); einzubauen. Was spricht dagegen, außer das man evt. Fehler nicht mitbekommt?

    Ausschalten musst du es nicht, du kannst sie auch an lassen, musst sie dann nur abfangen und loggen.

    Helfen dürfte dir hierbei:
    http://www.zdnet.de/anwendungsentwicklung_eigener_error_handler_mit_php_story-20000201-39147726-1.htm
    Bzw. Google mit "php error logging" "php error handler" etc

    christian1603 schrieb:
    PS:
    lordam, ich hoffe ich klau dir dein Thema nicht.

    Threads sind Eigentum von Lima-City :D
  15. Nur um hier mal auszuklären, warum der ' OR 1 -- Trick bei dir nicht geht, obwohl du mysql_real_escape_string nicht benutzt: Auf Lima-City ist ein Feature namen magic_quotes aktiviert. Dieses escaped automatisch alle $_GET, $_POST, $_... Variablen.

    Dennoch sollte man sich auf dieses Feature nicht verlassen. Einerseite kann es seltsame Ergebnisse verursachen, wenn du Daten nicht in die DB einträgst und is zudem auch nicht gänzlich sicher (mysql_real_escape_string beachtet das Encoding der Datenbank und der Verbindung zur Datenbank, magic_quotes kann dies nicht).

    Das normale Vorgehen ist daher meistens zuerst die magic_quotes zu entfernen, sollten sie aktiviert sein und dann immer wenn man etwas in einen SQL Query einfügt es mit mysql_real_escape_string zu escapen. Ich persönlich nutze für letzteres einen kleinen Wrapper, der einem etas Tipparbeit erspart (ist aber PDO MySQL, nicht mysql_): https://github.com/nikic/DB
  16. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!