Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13
  1. #1
    Anfänger Avatar von j0kR
    Registriert seit
    01.04.2009
    Beiträge
    27

    Standard SQL Injektions auf der eigenen Homepage schließen

    So ich werde euch nun erklären, wie man eine SQL Injection Lücke auf seiner eigenen Seite schließen kann.

    Als Beispiel hierfür verwende ich einen einfachen Registrierungsvorgang, der die eingetragenen Daten (Benutzername, Passwort und Emailadresse) in eine Datenbank schreibt.
    Dafür werde ich euch den PHP-Code posten und ihn mit Kommentaren versehen, damit ihr versteht, was ich gemacht habe.

    Das ist die Datei in der ihr die Daten eintragen müsst. (Es müsste ohne Erklärung verständlich sein)

    Code:
             <form action="reg.php" method="post">    //sendet die Daten an die Datei reg.php
             <table border="0">
             <tr><td>Benutzername:</td><td><input type="text" name="benutzer"></td></tr>
             <tr><td>Passwort:</td><td><input type="password" name="pass"></td></tr>
             <tr><td>Wiederholung:</td><td><input type="password" name="passw"></td></tr>
             <tr><td>Emailadresse:</td><td><input type="text" name="mail"></td></tr>
             </table>
    Und dann kommt noch die reg.php Datei:

    Code:
    <?php
    include("include/db.inc");          //hier sind die Daten enthalten, die für die Verbindung mit der Datenbank erforderlich ist
    
    $benutzer=$_POST['benutzer'];   //Eingaben bei Benutzer werden in der Variablen $benutzer gespeichert
    $pass=md5($_POST['pass']);      //Eingaben bei Passwort  werden in der Variablen $pass gespeichert
    $passw=md5($_POST['passw']); //Eingaben bei Passwort (Wiederholung) werden in der Variablen $passw gespeichert
    $email=$_POST['mail'];             //Eingaben bei Email werden in der Variablen $email gespeichert
    
    $benutzer=strip_tags($benutzer);     //HTML- und PHP-Code entfernen. (aus der Eingabe Benutzer)
    $benutzer=htmlentities($benutzer); //Umlaute und Sonderzeichen in HTML-Schreibweise umwandeln
    $benutzer=trim($benutzer);            //Entfernt überflüssige Zeichen am Anfang und Ende einer Zeichenkette
    $benutzer=stripslashes($benutzer); //Backslashes entfernen
    
    $email=strip_tags($email);             //Hier das Gleiche wie zuvor nur aus der Eingabe Passwort
    $email=htmlentities($email);
    $email=trim($email);
    $email=stripslashes($email);
    
    //Dieses Verfahren ist bei Passwort nicht nötig, da es mit md5 verschlüsselt wurde und dezufolge keine Sonderzeichen enthalten kann
    
    
    //Jetzt werden die eingetragen Daten in die Datenbank geschrieben - aber ohne SQL Injections :)
    
    $db=db_connect();
    $anfrage="INSERT INTO login VALUES (0,'".$benutzer."', '".$pass."', '".$email."', now())";
    $ergebnis=db_query($anfrage);
    db_close($db);
    ?>
    Ich hoffe, dass es soweit verständlich war. Ich habe keine HTML Erläuterung vorgenommen (auch keine MYSQL...), da das nicht der Sinn des Tutorials ist. Es soll jediglich gezeigt werden, wie man SQL Injections bei sich verhindern kann und habe deshalb gewisse Kenntnisse vorausgesetzt.

    Falls ihr trotzdem noch Fragen zu bestimmten PHP/MySQL/HTML Abschnitten habt, dann werde ich dazu ggf. auch noch ein Tutorial machen.

    mfg
    j0kR

  2. #2
    Michelangelo Virus Avatar von newkaiza
    Registriert seit
    05.09.2008
    Beiträge
    276

    Standard

    naja denke nicht das es schlau ist dies so zu verwenden :
    include("include/db.inc");

    Auch wenn im includes Ordner Permissions gesetzt sind , setzt lieber .php dran :-P

  3. #3
    Anfänger Avatar von j0kR
    Registriert seit
    01.04.2009
    Beiträge
    27

    Standard

    Da sind nur die Daten drinne, die du zum Connecten brauchst. Also Datenbankname, Passwort usw

  4. #4
    Michelangelo Virus Avatar von newkaiza
    Registriert seit
    05.09.2008
    Beiträge
    276

    Standard

    ja genau deswegen ja ......
    Geändert von newkaiza (29.08.2009 um 15:53 Uhr)

  5. #5
    Anfänger Avatar von j0kR
    Registriert seit
    01.04.2009
    Beiträge
    27

    Standard

    Auf die kann man normalerweise nicht zugreifen und sie ist noch mit der Funktion md5() verschlüsselt ^^

  6. #6
    Kevin Lee Poulsen Avatar von VeN0m
    Registriert seit
    30.12.2008
    Beiträge
    1.270

    Standard

    Das, was newkaiza meint ist, dass Dateien mit der Endung "inc" vom Browser aufgerufen werden können. Und wenn dort Verbindungsdaten zu MySQL oder ähnlichem drin steht und der Host-Eintrag des Benutzers in der Tabelle der berechtigten User nicht auf "localhost" oder ähnlichem steht sondern auf "%" so kann man von überall auf diese Datenbank verbinden...

    Und was meinst Du mit, "sie ist noch mit der Funktion md5() verschlüsselt"? Der Inhalt der db.inc oder wie? Ergibt für mich keinen Sinn, da MD5 nicht entschlüsselbar ist.
    Zudem sollte man Variablen, die der User bestimmen kann und an MySQL gehen grundsätzlich _immer_ mit der Funktion mysql_real_escape_string() behandeln, um z.B. das Sonderzeichen Hochkomma mit dem Backslash zu escapen...

    Alles in einem: Ich finde das Tutorial an sich nicht so gut. Eine Injection sollte immernoch möglich sein, da eine einfache Manipulation immernoch erlaubt ist - Du verhinderst hier höchstens XSS durch die Entferung der HTML-Tags / Umwandlung der Sonderzeichen.

    Zudem wäre es ganz toll gewesen, würdest Du die Tablellenstruktur posten, denn: Du nutzt in dem Insert "now()", was die aktuelle Zeit liefert - Aber wenn man sich die Struktur der Tabelle nicht in etwa vorstellen kann weiß man nicht, dass das ein Registrierungszeitstempel sein kann...

    Ach... Und geläufiger sind Injectionen, die in einem Select-Query angewandet werden - Nich bei Insert, solche Injectionen kennt nicht jeder .
    Geändert von VeN0m (29.08.2009 um 16:20 Uhr)
    Come to the dark side - We have cookies

  7. #7
    Anfänger Avatar von j0kR
    Registriert seit
    01.04.2009
    Beiträge
    27

    Standard

    Ok das werd ich dann beim nächsten Mal besser machen

    Das man die inc Datei aufrufen kann stimmt... also das kann man ja leicht überarbeiten.

    Das deine Injection noch erlaubt ist keine ich jetzt nichs weiter zu sagen.
    Am besten postest du mal eine harmlose Injection und ich probiere das mal aus und überarbeite das Tut dann nochmal.

  8. #8

    Standard

    Stimme da Power-Sven zu, was du hier erklärst müsste eigentlich heißen:
    "Wie mit einem Insert-Query arbeiten" oder ähnliches...
    Aber ein Schutz gegen SQL-Injections, vorallem noch allgemein betont, wobei es noch 1000 möglichere andere Lücken bei SQL-Querys geben kann, ist das nicht.
    Allein auch das:
    $benutzer=strip_tags($benutzer); //HTML- und PHP-Code entfernen. (aus der Eingabe Benutzer)
    $benutzer=htmlentities($benutzer); //Umlaute und Sonderzeichen in HTML-Schreibweise umwandeln
    $benutzer=trim($benutzer); //Entfernt überflüssige Zeichen am Anfang und Ende einer Zeichenkette
    $benutzer=stripslashes($benutzer)

    Ist vollkommen unnötig, ein wie Sven schon sagte mysql_real_escape_String() hätte genügt, andere Charsets möchte ich erst gar nicht erwähnen..
    Geändert von fred777 (29.08.2009 um 16:53 Uhr)
    _n0p3_

  9. #9
    Kevin Lee Poulsen Avatar von VeN0m
    Registriert seit
    30.12.2008
    Beiträge
    1.270

    Standard

    Das deine Injection noch erlaubt ist keine ich jetzt nichs weiter zu sagen.
    Hätte jetzt konkret behauptet, dass eine Insert-Injection hier dennoch funktionieren wird. So etwas, wie ',(select version());-- f. Oder eben ähnliches. Ist aber eben ein heikles Thema, das Verhindern von Injectionen. Weil es eben, wie Fred schon sagte, verschiedene Ansatzpunkte bei Queries für Injectionen gibt. Irgendwie kommt man - fast - immer rein, besonders bei komplexen Seiten.
    Geändert von VeN0m (29.08.2009 um 17:03 Uhr)
    Come to the dark side - We have cookies

  10. #10
    OpCodeKiddy Avatar von EBFE
    Registriert seit
    30.03.2009
    Beiträge
    442
    TrueCrypt/RAR/Zip Passwort vergessen und das Bruten dauert ewig? Oder brauchst du fein abgestimmte Wortlisten? Hilf dir selbst mit WLML - Word List Markup Language
    Gib Stoned/Mebroot/Sinowal und anderen Bootkits keine Chance: Anti Bootkit v 0.8.5

Seite 1 von 2 12 LetzteLetzte

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •