[S] PHP/MYSQL Sicherheit TUT

  • Hallo,
    ich suche eine Tutorial zum schnellen lernen, was man nicht machne
    sollte wobei nicht unbedingt darauf eingegangen werden muss
    dass man keine .inc Datein mit Passwörtern includen soll usw.
    Für sowas reicht das normale brain.exe nur was sollte man beachten
    um nicht Opfer von SQL Injections zu werden und was gibt es da noch
    für Angriffsmöglichkeiten außer dieser und BruteForce?

    Ein Buch habe ich hier aber ich möchte es lieber mit einem Tutorial
    lernen.

    Danke


    GELÖST:
    PHP und MySQL Sicherheit

    Einmal editiert, zuletzt von Darkxor (26. Januar 2009 um 19:05)

  • wir können ja alle mal unsere üblichen maßnahmen posten, um uns vor SQL Injections zu schützen... da lernt man sicher immernoch neue sachen dazu :)

    also,
    ich haue eigentlich alles was mir einfällt rein um jede vom user veränderbare variable zu überprüfen:

    id's verwandele ich grundsätzlich zu integern:

    PHP
    $id = (int) $_GET['id'];

    andere zahlen prüfe ich mit funktionen wie:
    is_numeric()
    ctype_digit()

    für namen, adressen, texte benutze ich diese funktionen:
    htmlspecialchars()
    htmlentities()
    ctype_alnum()

    bestimmte variablen schneide ich zur sicherheit auch ab mit:
    strlen()

    sachen mit schema wie z.B. email adressen werden zusätzlich noch mit einem regulären ausdruck via preg_match() überprüft

    und grundsätzlich alles, was der user nur in irgendeiner weise verändern kann wird nur mit mysql_escape_string() in die datenbank gepackt...

    mehr fällt mir gerade nicht ein :D

    Der frühe Vogel fängt den Wurm,
    aber die zweite Maus bekommt den Käse.

    Einmal editiert, zuletzt von pApAnoAh (26. Januar 2009 um 11:44)


  • und grundsätzlich alles, was der user nur in irgendeiner weise verändern kann wird nur mit mysql_escape_string() in die datenbank gepackt...

    Zitat von php.net


    hinweis: Diese funktion ist seit php 4.3.0 veraltet. Benutzen sie diese funktion nicht und verwenden sie stattdessen mysql_real_escape_string()

    Ich mache mir hierfür immer ne Alias Funktion mit kürzerem Namen:

    PHP
    function escapeForQuery($string) {
     return mysql_real_escape_string($string)
    }

    Außerdem kann man dann an an dieser Stelle den String der in die DB kommt weiter vorbereiten, im Bezug auf Charset oder sowas z.B..

    Und ansonsten fällt mir in sachen SQL-Injections auch nichts mehr ein.

  • Ich mache mir hierfür immer ne Alias Funktion mit kürzerem Namen:


    Um 10 Zeichen Tipparbeit zu sparen eine eigene Funktion? Ob das Sinn der Sache ist? ;)

  • Hallo,
    wenn ich das nun escapen will, wie funktioniert das denn dann?

    So wahrscheinlich nicht oder?

  • PHP
    $sql = "INSERT 
             INTO
               teilnehmer
             set 
               `vorname`  = '" . mysql_real_escape_string($name)     . "', 
               `nachname` = '" . mysql_real_escape_string($nachname) . "', 
               `email`    = '" . mysql_real_escape_string($email)    . "', 
               `link`     = '" . mysql_real_escape_string($link)     . "'";
  • Hallo,
    danke für die mal wieder mega schnelle Antwort ;)
    Wo liegt denn der Unterschied zwischen VALUES und set?
    Danke

    Edit:

    PHP
    $sql = "INSERT 
             INTO
               teilnehmer
             set 
               `vorname`  = '" . mysql_real_escape_string($vorname)     . "', 
               `nachname` = '" . mysql_real_escape_string($nachname) . "', 
               `email`    = '" . mysql_real_escape_string($email)    . "', 
               `link`     = '" . mysql_real_escape_string($link)     . "'";

    So wird nichts eingetragen.

    2 Mal editiert, zuletzt von Darkxor (30. Januar 2009 um 23:56)

  • Der Unterschied liegt nur in der Schreibweise, ich finde set besser lesbar. Schreibe mal

    PHP
    $eintragen = mysql_query($sql) or die ("MySQL-Error: " . mysql_error());
  • Hallo,
    danke der Fehler war eine falsch benannte Spalte.

    Frage mich momentan noch warum '".."' notwendig ist und nicht
    einfach '' geht?


    PHP
    $sql = "INSERT 
             INTO
               teilnehmer
             set 
               `vorname`  = '" . mysql_real_escape_string($name)     . "', 
               `nachname` = '" . mysql_real_escape_string($nachname) . "', 
               `email`    = '" . mysql_real_escape_string($email)    . "', 
               `link`     = '" . mysql_real_escape_string($link)     . "'";


    Geht es so nicht auch?

    PHP
    $sql = "INSERT 
             INTO
               teilnehmer
             set 
               `vorname`  = ' mysql_real_escape_string($name)     ', 
               `nachname` = ' mysql_real_escape_string($nachname)', 
               `email`    = 'mysql_real_escape_string($email) ', 
               `link`     = 'mysql_real_escape_string($link)'";
  • Hab ich..

    Dann sieht es in der DB folgendermaßen aus wobei sfgd die Eingabe war.

    PHP
    mysql_real_escape_string(sfgd)

    Warum es nach deinem Schema aber geht ist dann bei mir immer noch
    nicht geklärt.

    Ich habe bisher bei MySQL die Erfahrung gemacht, dass die Zeichen
    folgendermaßen beachtet werden:

    . = Verkettungsoperator
    " = Konstant einfügen
    ' = Inhalt berücksichtigen

    Doch warum dann ein ' " . . " ' da steht kann ich mir damit nicht
    erklären.

  • In meinem Script findet eine Stringverkettung statt, das hat mit MySQL herzlich wenig zu tun.

    Und mysql_real_escape_string liefert ja einen String, also

    $string = "Ein Teilstring" . String_von_mysql_real_escape_string . "und noch ein Teilstring";

    Bei dir wird die Funktion mysql_real_escape_string nicht aufgerufen, sondern als String interpretiert.

  • Hallo,

    wie sieht das eigentlich mit Dropdownmenüs aus,
    dort besteht ja ein Value Wert und mit bestimmten
    Firefox Plugins kann man Homepagequelltexte bearbeiten
    und sich diese dann erneut anzeigen lassen.

    Da es aber nur heißt alle Usereingaben sind gefährlich würde
    dies heißen, dass dieser Aspekt nicht gefährlich ist.
    Stimmt dies oder könnte ein potentieller Angreife mit Hilfe dieser
    Valueänderung entsprechende Angriffe starten, wenn die Dropdownvalues nicht vorher nochmal geprüft werden?

    Danke

  • Das hängt von deiner Programmierung ab ;)
    Wenn du die Values der Dropdowns für DB-Abfragen verwendest, könnte ein Angreifer durchaus einen SQL-Injection durchführen.
    Dagegen schützt du dich, wie bereits gesagt, durch die konsequente Verwendung von mysql_real_escape_string


  • Hallo,
    also ist es möglich dieses wie oben beschriebene Sicherheitsmanko
    einzusetzen? Ich weiß noch nicht so ganz ob das wirklich gehen würde
    da das Plugin denke ich mal die bearbeitete HTML Seite lokal speichert,
    jedoch die aktion="..." wieder auf dem Webserver aufgerufen werden
    könnte.

  • Och Menno.
    Mal ganz deutlich:
    Ein Formular mit nem Dropdown:

    Code
    <form action="tuwas.php" method="post">
    <select name="person">
    <option value="Olaf">Olaf</option>
    <option value="Heinz">Heinz</option>
    </select>
    <input type="submit" value="Person anzeigen" />
    </form>

    die tuwas.php liest dann aus einer DB die Daten der Person aus, welche im Dropdown ausgewählt wurde:

    PHP
    $person = $_POST['person'];
    $sql = "SELECT id, name, vorname, adresse FROM persons WHERE vorname = '$person'";
    mysql_query($sql);
    //Daten anzeigen oder was auch immer

    Das value aus dem Formular wurde einfach so übernommen, und evtl. durch erwähnte Plugins verändert, könnte also in der Form

    Code
    value="ganz böser Code"

    vorliegen und würde dann von deinem Script auch ausgeführt werden.
    Und ums auf einen Nenner zu bringen:

    Zitat


    Da es aber nur heißt alle Usereingaben sind gefährlich würde
    dies heißen, dass dieser Aspekt nicht gefährlich ist.


    Usereingaben sind nicht nur, was du als Usereingaben vorsiehst, sondern alle durch den User manipulierbare Eingaben, also grundsätzlich alle Formulare.

    Gruß,
    jojo