chmod-Problem

tobias1985

Der Erlöser
ID: 37913
L
24 April 2006
4.963
607
Hi,
ich hab ein kleines Problem, den richtigen CHMOD zu finden oder es geht einfach nicht so wie ich will. :ugly:
Also es gibt eine Datei die soll gelesen und geschrieben werden können von einem PHP-Script auf dem gleichen Server.
Allerdings soll die Datei nicht von außen, das heißt per URL-Eingabe im Browser z.B. aufrufbar sein.

Geht das per CHMOD? Wenn ja wie?
Ich hätt jetzt gedacht 770, allerdings kann ich damit die Datei mit meinem PHP-Script auch nicht mehr lesen. :-?

Danke schonmal für eure Hilfe!
 
Ich habe keine Ahnung wie das bei PHP geregelt ist, aber wenn du mit deinem PHP-Script nicht mehr auf die Datei zugreifen kannst und die einzige Einschränkung bzgl des Lese-, Schreib- und Ausführungsrechtes die letzte Ziffer (also die "alle-anderen-User-Stelle) ist, dann wird der Owner wohl falsch sein. Gibt es mit der PHP-Realisierung auch ein CHOWN? Wenn ja, müsste das PHP-Script quasi owner der Datei bzw in der richtigen Gruppe (nämlich in der, die Sonderrechte für die Datei besitzt) sein...
Wenn das mit CHOWN unter PHP möglich ist, müsstest du quasi das PHP-Script (bzw die Instanz, die das PHP-Script ausführt) als owner setzen und könntest dann als CHMOD 700 nehmen. Dann darf nur das Script alles, und der gesamte Rest darf nichts.
 
@mydoys.de: Damit kann das PHP-Script die Datei nicht mehr lesen.
@jackmaster: Das Problem von chown unter PHP ist:
https://www.php.net/chown schrieb:
Nur der Superuser kann den Eigentümer einer Datei ändern.
Und damit kann das PHP-Script den Eigentümer nicht ändern. Aktueller Eigentümer der Datei die gelesen werden soll ist ftponly, da diese per FTP hochgeladen wurde.
 
Und ich nehme mal an, dass Du keinen Root-Zugriff hast, oder? :-?
Ok, dann muss ich leider passen und wünsche Dir, dass sich noch jemand meldet, der sich mit sowas unter PHP auskennt...
 
Doch ich habe root-Zugriff, allerdings ist das Script auch für andere Nutzer und nicht jeder hat root-Zugriff. Viele haben einfach nur normalen Webspace...
Ich habs jetzt anders gelöst:
-> Aufruf des PHP-Scriptes
-> FTP-Verbindung per PHP aufbauen
-> CHMOD der Log-Datei per FTP-Verbindung setzen auf 777
-> FTP-Verbindung schließen
-> Log-Datei auslesen, verarbeiten und ausgeben
-> FTP-Verbindung per PHP aufbauen
-> CHMOD der Log-Datei per FTP-Verbindung setzen auf 700
-> FTP-Verbindung schließen
-> Ende des Scripts

Ist nicht gerade elegant, da bei jedem Aufruf 2 mal eine FTP-Verbindung geöffnet werden muss und für die Sekunden in denen CHMOD gesetzt wird, die Datei ausgelesen wird und CHMOD wieder zurückgesetzt wird auf 700 die Log-Datei von außen lesbar ist.
Allerdings genau die Sekunde zu erwischen dürfte schwer werden und so brisant sind die Daten im Logfile auch wieder nicht.

Wenn jemand eine bessere Lösung weiß, wäre ich froh drüber. Die Log-Datei per HTACCESS zu schützen, wäre eine Möglichkeit, allerdings möchte ich das den Usern ersparen. Das Script soll auch einfach verwendet werden können, von Usern die sich nicht auskennen.
 
Hm... Also, so finde ich das sehr unschön. Wenn das Script mittendrin abbricht oder der FTP beim zweiten connect nicht zu erreichen ist, bleibt die Datei ja auch auf 777. Ich weiß allerdings auch nicht, was an htaccess so schlimm sein soll...
 
Deine Bedenken sind korrekt.
Und an HTACCESS ist garnix schlimm. Das Script soll aber so einfach sein, dass der User nur 2-3 Variablen setzen und es nur hochladen muss. Fertig.
Wenn ich jetzt noch mit HTACCESS anfange...
Deshalb wäre die einfachste Möglichkeit CHMOD gewesen. Aber das kann man scheinbar nicht so einstellen, dass das Script jederzeit zugreifen kann, man von außen aber nicht rankommt.
 
Aber die Logdatei soll doch per http generell nicht erreichbar sein, oder? Dann müsste an der htaccess vom User ja auch gar nichts verändert werden, sie muss einfach jeden Zugriff direkt abblocken. Ist dann nur eine weitere Datei, aber nichts womit der User irgendetwas zu tun hätte.
(Klar, die Sache ist auch nicht so wahnsinnig wichtig, dass man das perfekt absichern müsste. Ich würde nur bei der htaccess keine Schwierigkeiten sehen, da ja dort nicht erst ein Passwort gesetzt werden muss oder sowas.)
 
OK ich erklärs nochmal kurz:
Es gibt ein kostenfreies Script, welches einige User einsetzen, um ihre Seiten vor Spamern zu schützen. Dieses Script schreibt ein Logfile mit den geblockten Daten.
Ich schreibe zurzeit ein Statistik-Script welches dieses Logfile auswertet.
Sinn an der Logfile-Auswertung soll natürlich auch sein, dass man nur noch über mein Statistik-Script das Logfile ansehen kann und das Logfile nicht mehr per Browser aufrufen kann. Das heißt, das Logfile benötigt genug Rechte, damit ichs mit meinem PHP-Script auslesen kann (und das Blocker-Script das Logfile weiterhin schreiben kann), das Logfile allerdings nicht per Browser erreichbar ist.

Hoffe ich habs verständlich erklärt. :)
Weitere Voraussetzungen sind natürlich, dass der User nicht noch HTACCESS-Dateien anlegen muss oder sonstiges. Man geht einfach mal von einem User aus, der nicht viel Ahnung hat. Derjenige muss einfach das Blocker-Script, das Statistik-Script und die Logdatei hochladen, in den Scripten noch Username/Passwort/Pfadangaben anpassen, fertig. Max. noch CHMOD setzen (was mittlerweile von fast jedem FTP-Programm sehr einfach gemacht werden kann).
Da es aber scheinbar kein CHMOD gibt, was meinen Wünschen entspricht, habe ichs zurzeit so gemacht, dass das Statistikscript eine FTP-Verbindung herstellt, darüber CHMOD setzt und wieder zurück...
Allerdings geht das auch nicht, wie mir gerade eingefallen ist. *g* Denn das Blocker-Script muss ja auch immer das Logfile schreiben können. Die Lösung CHMOD per FTP im PHP-Script zu setzen funktioniert in meinem Statistik-Script. Allerdings kann ich dies nicht im Blocker-Script einbauen, da das Blocker-Script nicht von mir programmiert wird und der Code davon immer wieder mal von dessen Progger geändert wird / aktualisiert wird. Damit wäre meine Änderung mit dem FTP im PHP-Script immer wieder weg.
Das heißt, ich kann den Code des Blockerscripts nicht ändern.

So wies aussieht bleibt also doch nur HTACCESS oder jemand findet noch eine passende CHMOD-Lösung.
 
chmod kann nur root oder der besitzer der datei.
wenn man mit php eine datei anlegt, gehört die php und man muss ,um sie mit ftp bearbeiten oder auch nur wieder löschen zu können, rechte dazu vergeben - also max. 0777 min. 0602.
wenn man per ftp eine datei anlegt kann php kein chmod machen.
damit php erstmal eine datei anlegen kann muss es natürlich die rechte dazu haben, also muss das verzeichniss max. 0777 min. 0602.

das ganze ist aber kritisch, weil jeder user die datei mindestens überschreiben kann.
 
Also, machen wir es mal uns einfach ... wenn ich es richtig verstanden habe, suchst du eine Lösung, damit auf der Datei nicht jedermann von aussen per HTTP zugreifen kann. Richtig?

Dann diese entweder ausserhalb des Stammverzeichnisses der Domain platzieren oder wenn das nicht geht, mit einem Punkt als erstes Zeichen benennen, z.B. ".logdatei.log". Sogenannte Punkt-Dateien sind unter Linux versteckte Dateien und der Apache weigert sich standardmässig diese anzuzeigen. Kein kompliziertes Handling über PHP oder htaccess notwendig.

Hilft dir das weiter?
 
SpecialsGuy schrieb:
..., mit einem Punkt als erstes Zeichen benennen, z.B. ".logdatei.log". Sogenannte Punkt-Dateien sind unter Linux versteckte Dateien und der Apache weigert sich standardmässig diese anzuzeigen.
falsch!
sie sind zwar versteckt, aber man kann sie genauso herunterladen.

alle dateien sperren mit .htaccess:
Code:
order deny,allow
deny from all
quick and dirty, aber funktioniert
es gilt auch nur in dem unterverzeichniss in dem die .htaccess liegt
 
Zuletzt bearbeitet:
DocTrax schrieb:
falsch!
sie sind zwar versteckt, aber man kann sie genauso herunterladen.

alle dateien sperren mit .htaccess:
Code:
order deny,allow
deny from all
quick and dirty, aber funktioniert
es gilt auch nur in dem unterverzeichniss in dem die .htaccess liegt

Ok, nach kurzem Überlegen hast du Recht, ich korrigiere mich :)

Normalerweise sind alle Dateien die mit ".ht" anfangen gesperrt, das ist der Standard beim Apache:
Code:
<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
</Files>

Ich habe es damit durcheinandergebracht, weil ich bei mir standardmässig alle Punktdateien in der Apache-Konfiguration gesperrt habe.
Code:
<Files ~ "^\.">
    Order allow,deny
    Deny from all
</Files>

So oder so kann man ein globales Muster festlegen, daß dann automatisch für die Dateien mit bestimmten Namen gilt oder wie du gesagt hast für ein ganzes Verzeichnis. Halte ich nach wie vor für die einfachste und unkomplizierteste Methode.
 
nen die log datei *.php und schreib in die erste zeile <?die();?>, damit ist sie eigentlich auf jedem system geschützt. musst aber ebend in deinen scripten beachten das in der log datei immer die() steht/bzw stehen muss. (ansonsten könnte das nen kritisches sicherheitsloch werden)
 
Auch ne Idee, allerdings bedarf das einer Änderung des Hauptscripts. Naja muss ich mal mit dem Programmierer des Hauptscripts reden. ;)