Zu den Aufzeichnungen der tutorials.de-Live-Workshops
ERLEDIGT
JA
ANTWORTEN
10
ZUGRIFFE
530
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    aargau aargau ist offline Mitglied Brokat
    Registriert seit
    Oct 2006
    Ort
    Schweiz / Fricktal
    Beiträge
    317
    Hallo Zusammen,

    Ich stehe vor einem sehr grossen Problem! Es hat mich heute jemand darauf aufmerksam gemacht das unsere Webseite wohl sehr leicht "Hack" bar seie. Nun habe ich das Problem das ich mich leider mit dem Problem (SQL-Injektion) nicht wirklich auskenne.

    Bis jetzt sieht es bei mir eig so aus:

    PHP-Code:
    <?php
    $id 
    $_GET["id"] ; 
    $daten mysql_query("SELECT was, auch, immer FROM member WHERE id='$id'") ;
    ...
    ?>
    Nun wollte ich Fragen wie ich das so umstellen kann das es danach vor SQL-Injektion`s Sicher ist?
    Ich habe selbst den Test gemacht beim PN System. Ich konnte zwar keine einträge ändern, jedoch war die gesammte Zeile fehlerfaft. Anstelle von der User ID stand der Injection-Code da etc..

    Bitte helft mir
     

  2. #2
    kawele89 kawele89 ist offline Rookie
    Registriert seit
    Feb 2007
    Beiträge
    5
     

  3. #3
    aargau aargau ist offline Mitglied Brokat
    Registriert seit
    Oct 2006
    Ort
    Schweiz / Fricktal
    Beiträge
    317
    Das heisst ich sollte wirklich alle Querys nochmal ändern mit dem:
    mysql_real_escape_string($_POST['spalte2Wert'])
    ?

    Und ist dies dann "sicher"?
    Könnte man theoretisch nicht auch einfach extrem abartige namen für die Tabellen verwenden? Dann könnte man ja auch nichts mehr tun, ausser man weis wie sie heissen
     

  4. #4
    kawele89 kawele89 ist offline Rookie
    Registriert seit
    Feb 2007
    Beiträge
    5
    Das heisst ich sollte wirklich alle Querys nochmal ändern mit dem:
    mysql_real_escape_string($_POST['spalte2Wert'])
    ?
    ja

    Und ist dies dann "sicher"?
    100% nicht, weil man nie sich 100% schützen kann aber zu 90% ja.

    Könnte man theoretisch nicht auch einfach extrem abartige namen für die Tabellen verwenden? Dann könnte man ja auch nichts mehr tun, ausser man weis wie sie heissen
    das ist sinnlos, weil man einfach mit +SHOW+TABLES; arbeiten kann.
     

  5. #5
    aargau aargau ist offline Mitglied Brokat
    Registriert seit
    Oct 2006
    Ort
    Schweiz / Fricktal
    Beiträge
    317
    Okay.

    Dann weis ich wenigstens was ich heute Nacht zu tun habe Sonst Surf ich eh nur herum

    Gibt es sonst noch irgend welche grossen Risiko-Sicherheitslücken in PHP / My SQL, die man unbedingt beachten sollte?
     

  6. #6
    l0c4lh05t l0c4lh05t ist offline Mitglied Gold
    Registriert seit
    Nov 2006
    Beiträge
    200
    100% nicht, weil man nie sich 100% schützen kann aber zu 90% ja.
    Dann sollte man es so machen, wie ich es in einem anderen Thread schon vorgemacht habe:
    PHP-Code:
    <?php
    /* ... */
    if(($HarmloseID intval($_GET['id'])) == 0){
      echo(
    "Fehlerhafte ID <br />\n");
    }else{
      
    $daten mysql_query("SELECT was, auch, immer FROM member WHERE id='".$HarmloseID."'");
      
    /* ... */
    }
    /* ... */
    ?>
    Denn ich habe noch nie eine SQL Injektion gesehen, die man so zu 100% auch in einen Integer wandeln könnte.
    Das Einzige, das du hierbei beachten musst ist, dass du keine ID 0 vergibst!

    Falls deine Frage hiermit beantwortet sein sollte, dann markiere dieses Thread bitte als "Erledigt" (indem du den entsprechenden Button benutzt).
     


  7. #7
    aargau aargau ist offline Mitglied Brokat
    Registriert seit
    Oct 2006
    Ort
    Schweiz / Fricktal
    Beiträge
    317
    Solange es sich um IDs handelt kann man das sicher so machen, aber die ganzen Textfelder kann ich so ja nicht überprüfen und ich denke die sind genau so wichtig wie die IDs
     

  8. #8
    l0c4lh05t l0c4lh05t ist offline Mitglied Gold
    Registriert seit
    Nov 2006
    Beiträge
    200
    Zitat Zitat von aargau Beitrag anzeigen
    Solange es sich um IDs handelt kann man das sicher so machen, aber die ganzen Textfelder kann ich so ja nicht überprüfen und ich denke die sind genau so wichtig wie die IDs
    Nicht nur Textfelder stellen ein Problem dar, sondern einfach alles, was nicht ausschließlich Ganzzahl ist.
    Dann muss man sich halt nach Alternativen umschauen - zum Beispiel preg_match(), falls die Eingabe einem bestimmten Muster entsprechen soll. Wobei ich mit "Muster" A-Z, a-z, 0-9 und nur bestimmte (Sonder-)Zeichen meine.
    Eingaben zu überprüfen ist auf jeden Fall nicht verkehrt
     


  9. #9
    Registriert seit
    Dec 2002
    Ort
    Trier
    Beiträge
    17.502
    Blog-Einträge
    10
    Prinzipiell gilt es sämtliche vom Benutzer kommende Werte als nicht vertrauenswürdig einzustufen, da du ja keinen Einfluss darauf hast. Deswegen musst du sie auf Gültigkeit prüfen, ob sie also die erwarteten Eigenschaften erfüllen (Validierung).
    Erfüllen sie diese nicht, hast du mehrere Möglichkeiten: Entweder du brichst das Skript ab oder du veränderst die ungültigen Wert so, dass sie wieder gültig sind. Dies ist bei den PHP-Datentypen am einfachsten, da hierzu einfach eine Typkonvertierung vorgenommen werden kann. Bei anderen Datendomänen (insbesondere Zeichenkettenformate) ist das jedoch schwieriger. Allgemein gibt es jedoch zwei Möglichkeiten: Filtern und Maskieren. Beim Filtern werden einfach alle ungültigen Eigenschaften entfernt. Beim Maskieren werden die ungültigen Zeichen durch gültige, aber äquivalente Maskierungsfolgen ersetzt. Dies macht beispielsweise die mysql_real_escape_string()-Funktion.
     
    Markus Wulftange

  10. #10
    aargau aargau ist offline Mitglied Brokat
    Registriert seit
    Oct 2006
    Ort
    Schweiz / Fricktal
    Beiträge
    317
    Reicht denn bei IDs die per GET übergeben werden
    PHP-Code:
    intval($_GET['id']) 
    oder sollte ich diese besser so filtern das nur 0-9 verwedet werden (mit preg_match()) ?

    Die Eingabefelder denk ich ist am sinnvolsten mit mysql_real_escape_string() zu überprüfen
     

  11. #11
    l0c4lh05t l0c4lh05t ist offline Mitglied Gold
    Registriert seit
    Nov 2006
    Beiträge
    200
    Ja, intval(); reicht bei Werten die zu 100% ein Integer sind.
    Aber aufpassen, der Wert, den du erwartest sollte nicht 0 sein, denn genau das gibt die Funktion bei Fehlschlag zurück
     


Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 14.09.10, 13:56
  2. Antworten: 21
    Letzter Beitrag: 15.05.09, 18:59
  3. PHP und SQL-Injektion
    Von Sasser im Forum PHP
    Antworten: 5
    Letzter Beitrag: 18.09.08, 16:29
  4. Script-Injektion bei einsundeins
    Von loetmann im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 08.10.07, 13:29
  5. Code sicher gegen XSS und SQL-Injektion
    Von slaughter89 im Forum PHP
    Antworten: 2
    Letzter Beitrag: 03.06.07, 16:52