Maike: fopen() - neue Datei erzeugen

Nabend Zusammen,

ich hab bei meinen code das Problem, dass er sagt diese kann Datei nicht erzeugt werden. Wo liegt mein Fehler?
Die Post['field_1'] sind Datenbankeinträge. Es funktioniert immer nur bis ich POST['field_4'] einsetze - diesen mag er als Datei nicht erzeugen! Den Ordner also field_1 findet er!

$filename = "./datenbank/". $_POST['field_1']."/". $_POST['field_4'].".txt";
if (is_writable($filename)) {

if (!$handle = fopen($filename, 'a'))
       {
            echo "Cannot open file ($filename)";
            exit;
       }
       if (fwrite($handle, $fileLine) === FALSE) {
           echo "Cannot write to file ($filename)";
           exit;
       }

fclose($handle);

} else {
       echo "The file  is not writable";
   }

Angenehme Nacht
Die Maike

  1. Hallo

    ich hab bei meinen code das Problem, dass er sagt diese kann Datei nicht erzeugt werden. Wo liegt mein Fehler?

    Du behandelst Eingabedaten nicht kontextgemäß.

    $filename = "./datenbank/". $_POST['field_1']."/". $_POST['field_4'].".txt";

    Behandle $_POST['field_1'] und $_POST['field_4'] so, dass sie nur noch Zeichen enthalten, die in Datei- und Ordnernamen erlaubt sind.

    Freundliche Grüße

    Vinzenz

  2. (Hallo|Hi(ho)|Tag|Mahlzeit) Maike,

    ich hab bei meinen code das Problem, dass er sagt diese kann Datei nicht erzeugt werden. Wo liegt mein Fehler?
    Die Post['field_1'] sind Datenbankeinträge. Es funktioniert immer nur bis ich POST['field_4'] einsetze - diesen mag er als Datei nicht erzeugen! Den Ordner also field_1 findet er!

    $filename = "./datenbank/". $_POST['field_1']."/". $_POST['field_4'].".txt";

    Naive Frage: Hast du die "Datenbankeinträge" vor dem Eintragen in deine Datenbank auf "böse" Zeichenfolgen geprüft? Wahrscheinlich nicht, denn dabei wäre dir dann sicher auch aufgefallen, dass ein Filesystem nicht alle Arten von Dateinamen mag.

    if (is_writable($filename)) {

    Is_writable() ist ganz nett, dass hilft dir aber nur, wenn dein PHP-Script auch wirklich keinen Schreibzugriff auf Verzeichnisse hat, in die es tunlichst nichts schreiben sollte.

    Du solltest dir die eingegebenen Pfadbestandteile vor dem Zusammenkleben mal genauer anschauen. Steht in $_POST['field_4'] bspw. "../../irgendeindateiname", dann schreibt dein Script nämlich ganz woanders hin, als du vorgesehen hast:

    http://www.websitesecuritybook.com/path-injection.php
    http://de.wikipedia.org/wiki/Directory_Traversal

    Hilfreich ist, den zusammengeklebten Pfad mit realpath() in einen absoluten Pfad umzuwandeln und den mal zur Probe auszugeben. Dabei werden Teilpfade wie "../" nämlich vorher aufgelöst:

      
    print(realpath($filename));  
    
    

    Ein einfacher Workaround, der beide Probleme auf die Schnelle löst, ist die Funktion rawurlencode(). Diese wandelt (u. A.) die in Pfadangaben oft kritischen Zeichen wie "?", ":", "" und "/" um.

    MffG
    EisFuX