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

  • Gast-Avatar
    Ein Gast erstellte das Thema [Erledigt] Verständnisproblem mysql_real_escape_string.

    [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?

  • nikosch
    antwortet
    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.

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    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!

    Einen Kommentar schreiben:


  • Papst
    antwortet
    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)."'"

    Einen Kommentar schreiben:

Lädt...
X