kostenloser Webspace werbefrei: lima-city


Wie schütze ich mich vor sql Injection?

lima-cityForumDie eigene HomepageSicherheit im Internet

  1. Autor dieses Themas

    christian1603

    Kostenloser Webspace von christian1603

    christian1603 hat kostenlosen Webspace.

    Hallo,
    ich habe von Injection gehört was genau ist das?
    was kann der hacker machen? und wie kann ich meine HP testen ob sie unsicher ist?
    und wie schütze ich sie davor?
    lg
    christian

    Beitrag zuletzt geändert: 2.2.2009 16:32:46 von christian1603
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

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

  3. kalinawalsjakoff

    Kostenloser Webspace von kalinawalsjakoff

    kalinawalsjakoff hat kostenlosen Webspace.

    Im prinzip kapert da ein Hacker über deine Site deine MySQL Datenbank und gibt da anweisungen für schädliches verhalten an. SOmit kann er irgendwie dann den Server manipulieren auf dem die Datenbank herumfliegt.
  4. m**********r

    Moin, in dem Wikipediaartikel ist eigentlich alles ganz gut beschrieben: http://de.wikipedia.org/wiki/SQL_Injection
    Und falls mehr Fragen auftauchen, einfach im Forum fragen.
  5. Autor dieses Themas

    christian1603

    Kostenloser Webspace von christian1603

    christian1603 hat kostenlosen Webspace.

    ok gibt es kostenlose programe wo mit ich meine hp auf sicherheit überprüfen kann also das sie nie 100% erreichen wirt is klar aber so die grund sachen
  6. Du schützt sie mit:
    mysql_real_escape_string

    Was der ANgreifer machen kann: Alles! Also, alles was mit der Datenbank zusammenhängt und meistens sogar noch mehr.
  7. f*************e

    Die Funktion alleine hilft nicht weiter :D

    Man muss darauf Achten, dass alle Argumente eines SQL Querys welche aus Variablen kommen mit ' oder " umgeben sind.

    Wenn man für eine Variable sicher ist, dass sie nur Zahlwerte annimmt sollte man sie vorher auch in den Int Typ umwandeln.


    Beitrag zuletzt geändert: 2.2.2009 21:55:41 von five-three-nine
  8. Hi,
    SQL Injection nennt man den Vorgang, den SQL String über die Webseite so zu verändern, dass in der Datenbank eine nicht authorisierte Aktion durchgeführt wird.
    Zum Beispiel:
    ...eine Loginseite, die Username und Passwort erfordert... diese Logindaten werden dann im PHP meist mit folgendem SQL String verifiziert:
    $sql = "Select * from users where username='".$_POST['user']."' and pwd='".$_POST['pwd']."'";
    $result = mysql_query($sql);


    Wenn im PHP die eingegebenen Daten (Username und Passwort) nun ungeprüft an den SQL String eingefügt werden, kann es zur SQL Injection kommen.
    Gibt der Nutzer zum Bsp. nicht einen Nutzernamen sondern folgenden Strings ein:
    Username: Admin
    Passwort: ' or 1=1 or pwd='

    entsteht folgende SQL Anweisung:
    $sql = "Select * from users where username='Admin' and pwd='' or 1=1 or pwd='';


    Somit würde PHP den User Admin per SQL finden und den Login authentifizieren ;-(


    Verhindern kann man das ganze indem man Eingaben prüft!
    Also zum Bsp. dass Username-Eingabe nur Buchstaben enthält und Passwort keine ' " oder =

    Am einfachsten geht dies mit dem neuen MySQLi.
    <?php
    $host = 'localhost';
    $user = 'username';
    $pass = 'password';
    $db = 'datenbank';
    
    /* create a connection object which is not connected */
    $mysqli = mysqli_init();
    
    /* set connection options */
    //$mysqli->options(MYSQLI_INIT_COMMAND, "SET AUTOCOMMIT=1");
    $mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5);
    
    /* connect to server */
    $mysqli->real_connect($host, $user, $pass, $db);
    
    /* check connection */
    if (mysqli_connect_errno()) {
        printf("Connect failed: %sn", mysqli_connect_error());
        exit();
    }
    
    if ($stmt = $mysqli->prepare("SELECT * FROM tablexyz WHERE spaltexyz LIKE ?")) {
        $tt2 = '%';  // der Wert nach dem gesucht werden soll, hier könnte auch ein $_REQUEST[] stehen, 
                     // MySQLi bindet immer den gesamten String an 1 Variable (womit SQL Injection verhindert wird)
       
        $stmt->bind_param("s", $tt2);
        $stmt->execute();
    
        $meta = $stmt->result_metadata();
        while ($field = $meta->fetch_field())
        {
            $params[] = &$row[$field->name];
        }
    
        call_user_func_array(array($stmt, 'bind_result'), $params);
    
        while ($stmt->fetch()) {
            foreach($row as $key => $val)
            {
                $c[$key] = $val;
            }
            $result[] = $c;
        }
       
        $stmt->close();
    }
    $mysqli->close();
    echo "<pre>";
    print_r($result);
    echo "</pre>";
    
    ?>


    In der Zeile " $stmt->bind_param("s", $tt2); " wird dabei die Eingabe überprüft und gleichzeitig an den SQL String gebunden. Falscheingaben laufen dann als Fehler auf.

    Also dann ... ran an MySQLi

    Beitrag zuletzt geändert: 2.2.2009 22:24:42 von scout
  9. Vielen Dank für die Hinweise.
    Allerdings würde mich außerdem noch interessieren, ob es nicht auch auf Admin-Ebene möglich ist die SQL Injections zu unterbinden?

    Kann das wirklich nur der Developer der PHP Applikation durch Überprüfung der Eingaben? Oder kann man als Admin nicht mit irgendeinem netten Schalter oder Patch das Problem aus der Welt schaffen?
  10. Wenn die PHP Applikation auf die Datenbank zugreifen muss und dabei variable Werte, eingegeben durch den Benutzern, abgefragt werden, muss nunmal auch das Script die Daten dementsprechend maskieren und ungefährlich an die Datenbank weitergeben.

    Und da dies auch nicht besonders kompliziert ist (wie bereits angesprochen: mysql_real_escape_string und intval), verstehe ich auch nicht den Sinn das irgendwie anders regeln zu wollen. Man könnte eventuell MySQL Befehle wie DROP TABLE oder ähnliches verbieten, dies reicht aber nicht als Schutzmaßnahme.

    Es gibt ein PHP Feature namens "Magic quotes", wo jegliche Eingabe vormaskiert wird, was jedoch nicht zu empfehlen ist, da dies nicht alle Möglichkeiten einer Injection berücksichtigt werden, wie es bei einer Datenbankfunktion wie mysql_real_escape_string oder bei prepared Statements der Fall ist. Außerdem sollte nicht jede Eingabe maskiert werden, schließlich werden meist nicht sämtliche Daten an die Datenbank weitergegeben.
  11. Autor dieses Themas

    christian1603

    Kostenloser Webspace von christian1603

    christian1603 hat kostenlosen Webspace.

    nikic schrieb: Du schützt sie mit:
    mysql_real_escape_string

    Was der ANgreifer machen kann: Alles! Also, alles was mit der Datenbank zusammenhängt und meistens sogar noch mehr.

    müste er nicht auch % rausfiltern? oder nur schlime sachen?
  12. Nein, % wir dnicht gefiltert. Warum auch?
    LIKE ist recht selten eingesetzt und zudem meist nur wegen der Unwissendheit des Programmierers, dass es andere Vergleichsoperatoren gibt.

    Like ist keine Allzweckwaffe!

    Wenn du das % auch ersetzen willst, musst du das via str_replace oder preg_replace realiseren. In diesem Fall eher die str-Variante...
  13. Guck mal auf novusec.com ist ne gute Seite .

    Generell kannst du über php alles bekommen. Selbst einen Root zugang legen. Es kommt immer darauf an welche php einstellungen Vorliegen. Sql injection wird meistens benutzt um ein Backup der Datenbank zu erstellen. Schützen kannst du dich wie gesagt über mysql_real_escape_string oder indem du die anfrage vorher auf sachen wie UNION,SELECT,',WHERE etc scannst.
  14. 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!