kostenloser Webspace werbefrei: lima-city


Sicherheit: Escape hier nötig?

lima-cityForumDie eigene HomepageSicherheit im Internet

  1. Autor dieses Themas

    tchab

    tchab hat kostenlosen Webspace.

    Moin Leute,

    ich habe ein kleines Script, welches Inhalte (Texte) in eine Datei legt.

    Normalerweise sollte man ja alles escapen, was rein kommt, ich frage mich nur, ob das hier nötig ist. Die Datei wird später via javascript ausgelesen, dass ich dort escapen muss, um das ausführen im Text enthaltener Scripte oder HTML-Weiterleitungen zu vermeiden ist mir klar, jedoch frage ich mich, was ein nicht escapter String bei PHP alleine anrichten kann.

    Eine Variante ohne Datenbankverbindung zu escapen habe ich dank willstdueswissen bereits gefunden:
    http://evertpot.com/escaping-mysql-strings-with-no-connection-available/
    Wie man dort lesen kann ist diese aber auch nicht zu 100% sicher.

    Das ist das php-Script, welches ich getippselt habe:
    <?php
    $dir = $_POST['url'];
    $user = $_POST['user'];
    $comment = $_POST['comment'];
    $filename = $dir . "/". time() . "\n";
    $seperator = "--- \n";
    $moderation = "moderated: 0" . "\n";
    
    if ("" == trim($user))      
            $user = "user: Anonymous \n";
    else
            $user = "user: " . $user . "\n";
    
    echo($dir . "\n");
    echo($user . "\n");
    echo($comment . "\n");
    echo($filename);
    
    if (!file_exists($dir)) {
            mkdir($dir, 0755);
    } 
    
    $commentfile = fopen($filename, "w");
    fwrite($commentfile, $seperator . $moderation . $user . $seperator . $comment );
    fclose($commentfile);
    ?>


    Grüße
    tchab
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

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

  3. thomasba

    Co-Admin Kostenloser Webspace von thomasba

    thomasba hat kostenlosen Webspace.

    Ich würde da schon soviel wie möglich mit PHP machen. Dann sind die Ausgangsdateien nachher nicht so vollgestopft mit unnötigem Zeug.

    Beim Verzeichnisnamen hast du ja bestimmt ein gewisses Muster, kannst daraus also ableiten, welche Zeichen benötigt werden und welche nicht. Wenn z.B: das Zeichen
    /
    nicht benötigt wird, schließen sich schon mal viele Angriffsszenarien aus.

    Beim Namen werden sicherlich auch nicht alle Zeichen benötigt, wie z.B. Zeilenumbrüche oder sonstige Steuerzeichen.

    Beim eigentlichen Kommentar sollen vermutlich keine oder zumindest nicht alle HTML-Tags erlaubt sein, da gibt es dann die nützliche Funktion strip_tags, die die HTML-Tags entfernt und auch eine Whitelist anbietet.

    Desweiteren solltest du vor der Ausgabe noch berücksichtige, was beim Speichern alles gemacht wurde, bzw. nicht gemacht wurde. Und z.B. den Usernamen mit htmlentities oder einer Äquivalenten Funktion behandeln.
  4. Autor dieses Themas

    tchab

    tchab hat kostenlosen Webspace.

    Danke.

    Nach etwas arbeit (und mit Hilfe von thomasba im Jabber) sieht das ganze nun so aus:

    <?php
    $dir =  "kommentare/" . preg_replace("|[^\\w]*|", "", $_POST['url']);
    $user = preg_replace("|[^\\w]*|", "", $_POST['user']);
    $comment = str_replace("&gt;", ">", htmlentities($_POST['comment'], ENT_QUOTES | ENT_HTML5 , "UTF-8"));
    $filename = $dir . "/". time() . "_" . $user . "_" . strlen($comment) . ".markdown" ;
    $seperator = "--- \n";
    $moderation = "moderated: 0" . "\n";
    
    if ("" == trim($user)) 
    	$user = "user: Anonymous \n";
    else
    	$user = "user: " . $user . "\n";
    
    if (!file_exists("kommentare"))
    	mkdir("kommentare", 0755);
    
    if (!file_exists($dir)) 
    	mkdir($dir, 0755);
    
    $commentfile = fopen($filename, "w");
    fwrite($commentfile, $seperator . $moderation . $user . $seperator . $comment );
    fclose($commentfile);
    ?>


    Aus URL und Usernamen werden alle Sondernzeichen gestrichen, da sie dort nicht benötigt werden

    Da die Formatierung später über Markdown geht musste ich sicher stellen, dass keine HTML-Tags eingebettet werden, weswegen < und > erst in &lt; und &gt; umgewandelt werden (so wie alle anderen Sonderzeichen auch, durch htmlentities). Um die Zitatfunktion von Markdown nicht zu zerstören wird &gt; danach wieder in > umgewandelt, jetzt entstehen beim export durch Markdown keine Tags, welche vom Browser interpretiert werden.

    Sicherheitstechnisch scheint das jetzt sowohl php-seitig als auch markdown-seitig nicht mehr angreifbar zu sein. Wem etwas auffällt, der kann es mir aber gerne sagen. :)
  5. 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!