helm: Schreiben einer Textdatei mit

Ich versuche mich an einfachen php-Übungen, die ich auf einer php-unterstützenden http://www-Seite ausprobiere.
Das Kommando
$fp = fopen("TEXT.txt","w");
führt zu der Meldung
Warning: fopen(TEXT.txt) [function.fopen]: failed to open stream:
Permission denied in /var/www/vhosts/***.php  on line ***
Ich kann dann noch einen Link in der Meldung anklicken, der erklärt:
The requested URL /probier/function.fopen was not found on this server.

Heißt das, dass ich etwas falsch mache, oder dass mein Server das Schreiben einer Textdatei verweigert.
Nebenbei: Textdateien lesen funktioniert.
Im Oder-Fall: Was kann man da machen?
Gruß, helm

  1. Du hast ganz offenbar kein Schreibrecht auf das betreffende Verzeichnis - da es direkt in der Server-Root liegt, ist das sicherheitstechnisch auch nicht die dümmste Idee.

    Was Du tun kannst:
    1. Die entsprechende Schreibrechte vergeben (Vorsicht, deutliches Sicherheitsrisiko - verteile Schreibrechte immer so spärlich wie möglich).
    2. Lege die entsprechende Datei an einer anderen, weniger geschützten bzw. schützenswerten Stelle ab.

    Gruß, LX

    --
    RFC 1925, Satz 2: Egal, wie fest man schiebt, ganz gleich, wie hoch die Priorität ist, man kann die Lichtgeschwindigkeit nicht erhöhen.
    1. Was Du tun kannst:

      1. Lege die entsprechende Datei an einer anderen, weniger geschützten bzw. schützenswerten Stelle ab.

      Gruß, LX

      Danke für die Antwort. Wo auf meiner Remote Site ist denn so eine weniger geschützte bzw. schützenswerte Stelle? Ich habe bisher alles im vom Server vorgegebenen Verzeichnis httpdocs abgespeichert. Da gibt es  z.B. außerdem noch die Verzeichnisse pd, private und web_users.
      Gruß, helm

      1. Du selbst kannst ein Unterverzeichnis in Deinem Web-Projekt erstellen und diesem freie Schreibrechte für den PHP-Prozess verpassen.

        Gruß, LX

        --
        RFC 1925, Satz 2: Egal, wie fest man schiebt, ganz gleich, wie hoch die Priorität ist, man kann die Lichtgeschwindigkeit nicht erhöhen.
        1. Du selbst kannst ein Unterverzeichnis in Deinem Web-Projekt erstellen und diesem freie Schreibrechte für den PHP-Prozess verpassen.

          Gruß, LX

          Hallo LX,
          Das war's. Bei so etwas komme ich ohne Mentor einfach nichrt weiter. Vielen, vielen Dank!
          Gruß, helm

          1. Wir alle haben auf diese Weise gelernt. Versuch und Irrtum, solange es geht und ansonsten jemand anderes fragen, der hoffentlich auf die Sprünge hilft.

            Gruß, LX

            --
            RFC 1925, Satz 2: Egal, wie fest man schiebt, ganz gleich, wie hoch die Priorität ist, man kann die Lichtgeschwindigkeit nicht erhöhen.
      2. Moin!

        Da gibt es  z.B. außerdem noch die Verzeichnisse pd, private und web_users.

        Dafür sollte es eine Dokumentation des Hosters geben. Mithin sind dies aber alles Verzeichnisse, die wahrscheinlich(!) vom Webserver nicht beachtet werden, da diese außerhalb des konfigurierten Document-Root liegen.

        Du kannst diese Verzeichnisse dann benutzen um darin also Daten abzulegen, die nicht - oder nicht ohne weiteres - via Webserver abrufbar sein sollen. Genau so gut kannst Du aber ein anderes Verzeichnis dafür benutzen, soweit Du die Rechte hast, dieses gegen Zugriffe zu schützen.

        Das kannst Du testen:

        lege ein Verzeichnis "test" im Verzeichnis "httpdocs" an. Setze die Rechte auf 0755. (Eigentümer: alle Rechte; Gruppe, Welt: Lesen und Betreten)
        lege in dieses Verzeichnis eine index.html (darin muss nicht viel stehen: "<h1>Test</h1>" reicht.
        lege darin eine Datei mit dem Name ".htaccess" an. Schreibe in diese "deny from all"

        Kommt bei einem Aufruf von http://Dein.Server/test/

        eine Fehlermeldung:
        403 - Forbidden - dann ist die Welt in Ordnung
        404 - dann hast Du Dich vertippt
        500 - Du hast als wertiger Kunde Deines Webhosters nicht einmal das Recht mit einer Datei ".htaccess" den Zugriff zu verbieten

        Nächster Test:
        bringe im Verzeichnis httpdocs eine test.php unter:

          
        <?php  
        $strDir='test'; # oder '../private' oder...  
        $strFile='./'.$strDir.'/hallo.txt';  
        $strRechte=false;  
        $strNewLine="\n";  
          
        /*  
         Test, ob das Verzeichnis existiert:  
        */  
        if (! is_dir($strDir)) {  
          die ("<strong>Fatal:</strong>: $strDir ist kein Verzeichnis.".$strNewLine.$strNewLine);  
        }  
          
        /*  
         Damit nicht versehentlich etwas überschrieben wird:  
        */  
        if (is_file($strFile) || is_dir($strFile)) {  
          die ("<strong>Fatal:</strong> $strFile existiert schon.".$strNewLine.$strNewLine);  
        }  
          
        /*  
         Prüfen, ob in das Verzeichnis geschrieben werden (Dateien angelegt, gelöscht, umbenannt) werden kann  
        */  
        if (! is_writable($strDir)) {  
           $strRechte=fileperms($strDir); # bestehende Rechte lesen  
          
           /*  
            Sehr großzügige Rechte setzen  
           */  
          
           if (false===chmod ($strDir, '0777')) {  
              die ('<strong>Fatal:</strong> Verzeichnisrechte für "'.$strDir.'" ('.$strRechte.') genügen nicht und konnten nicht gesetzt werden.'.$strNewLine);  
           }  
          
           echo '<strong>Warnung:</strong> Verzeichnisrechte für "'.$strDir.'"  ('.$strRechte.') genügten nicht, wurden deshalb auf "777" gesetzt.<br />Nach dem test wird automatisch versucht, diese zurück zu setzen.'.$strNewLine;  
        }  
          
        /*  
          Versuch die leere Datei anzulegen:  
        */  
        if (false===touch($strFile)) {  
           die ('<strong>Fatal:</strong> Trotz aller schönen Theorien konnte die Datei "'.$strFile.'" nicht angelegt werden. Frage den Hoster warum das so ist.'.$strNewLine.$strNewLine);  
        }  
          
        /*  
          Versuch die Schreib-Rechte für die ganze Welt zu setzen:  
        */  
        if (false===chmod($strFile, '0666')) {  
           die ('<strong>Fatal:</strong> Trotz aller schönen Theorien konnten für die Datei "'.$strFile.'" keine Rechte vergeben werden. Frage den Hoster warum das so ist.'.$strNewLine.$strNewLine);  
        }  
          
        /*  
          Versuch in die Datei zu schreiben:  
        */  
        if (false===file_put_contents($strFile, 'Hallo Welt!')) {  
           die ('<strong>Fatal:</strong> Trotz aller schönen Theorien konnte nicht in die Datei "'.$strFile.'"  geschrieben werden. Frage den Hoster warum das so ist.'.$strNewLine.$strNewLine);  
        }  
          
        /*  
          Versuch die Datei zu lesen:  
        */  
          
        echo 'Die Datei "'.$strFile.'" hat jetzt folgenden Inhalt:<hr /><pre>'.$strNewLine;  
        readfile  ($strFile);  
        echo $strNewLine.'</pre><hr />'.$strNewLine;  
          
        /*  
          Versuch die Datei zu löschen:  
        */  
        if (false===unlink ($strFile)) {  
           die('<strong>Die Datei "'.$strFile.'" konnte nicht gelöscht werden. Warum ist unklar. Lösche die Datei manuell per FTP.</strong>'.$strNewLine.$strNewLine);  
        }  
          
          
        /*  
          Wurden Rechte am Verzeichnis gesetzt so wird versucht, diese zurück zu setzen:  
        */  
          
        if (! false ===$strRechte) {  
            chmod ($strDir, $strRechte) or die('<strong>Die Dateirechte am Verzeichnis "'.$strDir.'" konnten nicht zurück gesetzt werden. Dies muss sofort manuell überprüft werden!</strong>'.$strNewLine.$strNewLine);  
          
        print 'Die Rechte am Verzeichnis "'.$strDir.'" wurden auf "'.$strRechte.'" zurück gesetzt.'.$strNewLine;  
        }  
          
        echo 'Scheint alles ok. zu sein, Die test-Datei wurde gelöscht'.$strNewLine.' ... exit.'.$strNewLine.$strNewLine;  
        ?>  
        
        

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix