Ein bisschen Sicherheit

Wir sammeln alle Infos der Bonusepisode von Pokémon Karmesin und Purpur für euch!

Zu der Infoseite von „Die Mo-Mo-Manie“
  • Hallööchen ;)


    folgendes: Ich hab hier im Forum so einige Codebeispiele gesehn, wos mir schon fast den Magen umdreht..
    Grund? Fehlende Sicherheit..


    Zu beginn hier mal ein toller xkcd Sketch, der das ganze verdeutlicht:
    http://xkcd.com/327/
    Wollt ihr den selben Fehler machen? Nein? Dann los.


    Ich garantiere euch jedoch keine vollständige Sicherheit. Das ganze sind nur Tipps um die Sicherheit zu vergrößern.


    Daten aus einem Formular holen
    Benutzt nie zur Weiterverarbeitung von Daten aus Formularen direkt $_GET oder $_POST.
    Holt euch am Anfang des Scripts die Daten aus den Arrays und validiert sie.
    Im Klartext: Soll es eine Zahl sein, sorgt auch dafür das es eine Zahl ist. Ist es ein Text, schneidet wenigstens Leerzeichenüberhang usw. ab.
    Umsetzung:

    PHP
    $zahl = intval($_POST['zahl']);$string = trim($_POST['string']);


    Datenbankabfragen
    Direkt in einer Datenbankabfrage $_GET oder $_POST zu verwenden ist schon fast das Todesurteil ;)
    Strings in einem Query sind heikel. Wie auch in dem Sketch kann man wenn der Entwickler nicht aufgepasst hat direkt einfluss auf das Query nehmen. Deswegen benutzt mysql_real_escape_string() um euren Query vor bösen Strings zu schützen.
    Doppelt hält besser. Irgendwo wird sich eine kleine Unachtsamkeit einschleichen.. Um dem entgegenzuwirken benutzt wenn ihr Zahlen einfügt nochmal intval().
    Umsetzung:

    PHP
    $sql = sprintf("SELECT * FROM user WHERE username = '%s' AND password = '%s' AND irgendeineZahl = %d",	mysql_real_escape_string($username),	mysql_real_escape_string($password),	intval($zahl));


    Tipp: legt euch einen alias an, damit ihr nicht so viel Tippen müsst.. zB:

    PHP
    function escapeString ($string) {
    	return mysql_real_escape_string($string);
    }


    Das wars erstmal. Wenn mir noch was einfällt, häng ich es noch an ;)

  • Wenn man nun ein Mehrnutzersys (PN-System, Community [selbstgeschrieben], etc.) schreibt / hat, sollte man natürlich darauf achten, dass die Daten auch so gesendet werden, wie es soll.
    Ich nehm hier mal als Beispiel den Timestamp eines Newseintrags auf einer Homepage.

    HTML
    <input type="hidden" name="time" value="1255204152" />


    Nun könnte man via Firebug, etc. den Quellcode verändern und zum Beispiel (habs ausprobiert, also sagt nicht, dass das nich geht! ;D) als Value eine 1 Senden lassen.
    Das wäre natürlich etwas Fatal, da dann das Datum nicht mehr stimmt, was natürlich zwar "nur" ein Schönheitsfehler ist, aber trotzdem irgendwie nicht aussieht. Man stelle sich die Möglichkeiten jemandes vor, der nun extra falsche Sachen senden lassen will!
    Als Lösung benutze ich dann eine Session mit dem Inhalt des Inputs.
    also z.B.:

    PHP
    <input type="hidden" name="time" value="<?php $_SESSION['time'] = time(); echo $_SESSION['time']; ?>" />


    Die Sessions lassen sich (meines Wissens) nicht so einfach abändern.
    also kann man auf der POST - Seite nun Folgende überprüfungen einsetzen:

    PHP
    <?php 
    if ( isset ( $_POST['time']) && isset ($_SESSION['time']) && $_POST['time'] == $_SESSION['time']) {
     ###Anweisungen### 
    ?>


    Wenn das keine Methode ist, dann belehrt mich einer anderen ;)


    Gruß
    Insert


  • Und warum trägst du dann nciht direkt das Datum aus der Session ein, anstatt das über Psot gegebene zu prüfen :ugly:


    Allgemein sollte man aber die kritische Eingaben validieren, oder halt in der Session speichern.

  • 1. news.php in news_post.php Postet, kann man so vlt. überprüfen, ob der POST überhaupt von news.php kommt? <- Schwachsinn, man kann das Formular auf jedem PHP server Nachbauen -.-'
    2. Diese Methode verhindert das Neusenden durch Reload-Knopf
    3. Ein anderes Beispiel wäre auch ein Key zum Editieren dieses Eintrags, der jeden Besuch der Seite neu in der Session gespeichert wird und dann jedes mal verglichen wird, ob beide (POST und SESSION) gleich sind. ( natürlich wird die Session erst nach dem vergleich neu generiert, wäre sonst ja schwachsinn!)

  • Deine Methode funktioniert nur, wenn man nur mit einem Tab arbeitet.


    Allerdings hatte ich auch noch nie so ein Problem, da ich so sensible Daten nie über das Formular übertrag..


    :thumbsup:


    Sowas muss hier unbedingt sein. Schönes Tutorial ;)


    danke ;)