Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Verständnisproblem mysql_real_escape_string

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Verständnisproblem mysql_real_escape_string

    Hey,

    bin grade am Website erstellen über PHP in Verbindung mit mySQL und bin an einem kleinen Verständnisproblem angelangt.

    Um mySQL injections vorzubeugen benutze ich mysql_real_escape_string. Interessehalber wollte ich mir die Ausgabe anschauen, bzw. wie strings escaped werden.

    Dabei stellte ich fest, dass nur ' mit \ escaped wird.

    Was aber, wenn die injection ohne irgendwelche string-felder (wie z.B. `password`) abläuft?

    Z.B. bei einer Tabelle `benutzer` mit `moderator` als Feld.
    In diesem Feld bedeutet 1=true, also Moderator - 0=false also normaler Benutzer.

    Wenn ich in der Browserleiste die jeweilige Unterseite dieser Website über s={INDEX_NO} aufrufe und danach eine injection nur über Zahlenfelder teste, funktioniert das doch problemlos, oder?

    Bsp.: index.php?s=5 ist der normale Seitenaufruf von Seite 5.

    Wenn ich die dann folgendermaßen aufrufe:

    index.php?s=5;+UPDATE+`benutzer`+SET+`moderator`=1 ;

    wird aber nichts escaped und das Query wird durchgeführt.

    Hab mal ne kleine .php file erstellt um das zu testen (analog zum oberen Beispiel):

    Code:
    // test.php
    $injection = "5; UPDATE `benutzer` SET `moderator`=1;";
    $string = "SELECT `seitenname` FROM `seiten` WHERE `s`=" . $injection;
    echo $string . "<br />";
    $string = "SELECT `seitenname` FROM `seiten` WHERE `s`=" . mysql_real_escape_string($injection);
    echo $string . "<br />";
    Output:

    SELECT `seitenname` FROM `seiten` WHERE `s`=5; UPDATE `benutzer` SET `moderator`=1;
    SELECT `seitenname` FROM `seiten` WHERE `s`=5; UPDATE `benutzer` SET `moderator`=1;
    Übersehe ich hier irgendwas oder sind weitere Schutzmaßnahmen notwending?

  • #2
    mysql_real_escape_STRING bereitet Strings darauf vor, in einem Query in die Datenbank geschrieben zu werden.
    Du versuchst es gerade mit integer.
    Code:
    "update `x` set `y` = ".(int)$input;
    
    oder
    
    "update `x` set `y` = '".mysql_real_escape_string($input)."'"

    Kommentar


    • #3
      Vielen Dank, jetzt isses klar.

      Hab mir auch grad nochmal den Kommentar aus dem Buch durchgelesen, hatte nicht wirklich gecheckt dass der Sinn ist, das ganze injection-query zu packen und in ' ' zu schmeißen, damit es nicht ausgeführt wird.

      Grüße!

      Kommentar


      • #4
        Das ist nicht der Sinn der Hochkommata. Sondern sie sind Teil der normalen SQL-Eingabesyntax. Die Sicherheit entsteht dadurch, dass real_escape das Verlassen dieses Kontextes verhindert und der Angriff damit nur eine normale Dateneingabe wird - wie krüptisch das auch immer aussieht.
        [COLOR="#F5F5FF"]--[/COLOR]
        [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
        [COLOR="#F5F5FF"]
        --[/COLOR]

        Kommentar

        Lädt...
        X