Seite 1 von 3

Verfasst: Montag 12. April 2004, 11:39
von hans
Ja, denn wenn das so wäre, dann könnte jeder Hinz & Kunz die Textdateien manipulieren, und damit alle UNIXE gute nacht mit euerer Security 8) Fast alle Konfigurationsdateien in Linux sind Textdateien.

Zunächst einmal .txt kennen glaube ich nur DOS basierte Systeme. Der Übersichtlichkeit wegen hat sich aber die Dateiextension als Standard etabliert. Einem Unixbasiertem System ist es egal, welche Dateiextension vorhanden ist. Den Dateityp kannst du notfalls mit file /dein/dateiname ermitteln.

Beim Systemstart wird dein Apache (httpd) gestartet. Dieser wird normalerweise mit einem eigenen User (nennen wir ihn ApacheUser) und nicht mit root-rechten gestartet. Wenn du jetzt ein CGI Script ausführst und eine Datei beschreiben willst, dann geht das immer, wenn der Owner ApacheUser Schreibrechte an der Datei hat.

Untersuch einmal deine /etc/httpd/conf/httpd.conf (Pfad könnte bei die etwas anders sein). Da sind User und Group definiert, unter denen Apache gestartet wird. Bei mir ist das in beiden Fällen apache.

Hans

Verfasst: Montag 12. April 2004, 11:48
von Gast
???

ist mir alles net neu, aber warum steht dann in jedem lehrbuch für cgi programmierung, in denen beispiele mit textdateien besprochen werden, die rechte müssen au 777???

das habe ich mal als richtig angenommen.

hast das noch nie gelesen?

mfg

rolgal

Verfasst: Montag 12. April 2004, 11:56
von Milan
Hi, da hat sich wohl das Lehrbuch vertan. Niemand ist unfehlbar. Ich glaube 755 würde auch vollkommen reichen (rwxr-x-r-x), wobei natürlich wichtig ist, für wen die 7 gilt. In dem Fall wohl für httpd... Ausprobieren kann ich es leider nicht bei mir selbst, sondern nur auf einem webserver, aber da reicht das vollkommen.

Milan

Verfasst: Montag 12. April 2004, 12:13
von Gast
ich probiere das jetzt gleich mal aus.
:?

Verfasst: Montag 12. April 2004, 12:40
von Dookie
Hallo nochmal,

hier scheint einiges durcheinander geraten zu sein.

Directories, in denen auch Dateien angelegt werden dürfen, müssen als Rechte 0755 haben, wenn nur der Owner Dateien, im Verzeichnis, anlegen darf, sonst 0777 wenn jeder Dateien hier anlegen darf.
Nicht ausführbare Textdateien die nur vom Owner geändert werden dürfen müssen 0644 als rechte haben, darf jeder die Textdatei ändern 0666. Ausführbare Dateien (CGI-Scripte) sollten 0755 haben.


Gruß

Dookie

Verfasst: Montag 12. April 2004, 12:53
von Gast
hi dookie

sehe es ja genauso. ich habe auch gerade folgendes probiert:
ein gästebuch mit einer textdatei. bei 755 passiert hier nichts. 755 ist für ausführbare cgi skripten.

die 0666 geht bei textdateien, wusste ich nicht.

also 777 für verzeichnisse und 0666 für dateien, wenn sie beschreibbar sein sollen.

mfg

rolgal

Verfasst: Montag 12. April 2004, 12:58
von Dookie
Hi rolgal,

wenn die Textdatei vom Script selber erzeugt wird reicht 0644.
immer die 0 davor, dann ists oktal und jede Stelle der Zahl entspricht 3 Bit.


Gruß

Dookie

Verfasst: Montag 12. April 2004, 18:37
von hans
Nehmen wir einmal an, dein Owner vom httpd Prozess ist wie bei mir apache, dann ist 755 für ein Verzeichnis ausreichend, wenn apache auch Owner vom Verzeichnis ist. Wenn du das auf 777 setzt, funktioniert das auch, aber du legst unter Umständen deine CGI Scripte offen. Wenn es auf einem Server läuft, sollte man das nicht machen.

Wenn das Script eine Datei erstellt, dann sollte die normal schon die Berechtigung 644 haben, ist in der Bash so, aber wo kommen da die Voreinstellungen her? Ein umask 022 vorher sollte die Einstellung vornehmen.

So lange du noch entwickelst, setze ersteinmal alles auf 777 (umask 0) und wenn es dann läuft, stell die Sicherheit ein.

Hans

Verfasst: Mittwoch 14. April 2004, 12:09
von Gast
hi !

wieder von vorne! wenn ich es geschnallt habe, dann muss ich jedesmal beim aufruf des skripts den nutzer ermitteln ihn zum besitzer der datei machen und ihm die notwendigen rechte übergeben.

so weit so gut. ich habe mir aber in der doku chown angeguckt und hier wird eine zahl erwartet für die uid und gid.

Code: Alles auswählen

os.environ['USER']
liefert aber einen string.

was tun sprach rolgal :D :?:

Verfasst: Mittwoch 14. April 2004, 12:55
von Dookie
Hi nochmal,

am Einfachsten ist es, wenn Du die Textdateien und Verzeichnisse, die mit CGI-Scripten bearbeitet werden sollen, auch von CGI-Scripten erstellen lässt.
Die CGI-Scripte laufen alle unter dem selben User, bei Debian-Linux heisst der "www-data", ganz egal wer grad das Script aufgerufen hat.

Mach Dir also am besten ein Initscript, das Du auf den Server lädst, welches die Verzeichnisse und Dateien erstellt, die von anderen Scripten bearbeitet werden sollen. In dem Script kannst Du auch Dateien von deinem Rechner hochladen lassen.

So gibts keine Probleme wegen falscher Rechte oder falschem Owner der Dateien und Verzeichnisse. Für Verzeichnisse kannst Du dann 0755 und für Dateien 0644 als Rechte benutzen.

Dann brauchst auch nicht mit Benutzern und Rechten rumdröseln.


Gruß

Dookie

Verfasst: Mittwoch 14. April 2004, 18:12
von Gast
hi dookie!

danke für den tipp, aber ich will ein bisschen was anders. jede seite soll bearbeitet werden können. über eine seite die ähnlich wie die sitemap dynamisch erstellt wird, kann ich im administrationsbereich, zu dem nur ich mich einloggen kann, eine seite zur bearbeitung auswählen.
freilich gibt es sowas in zope, ich will es aber tiefer in der seite integriert.

mfg


rolgal

Verfasst: Mittwoch 14. April 2004, 18:37
von Dookie
Hi rolgal,

is ja egal, dann lad die Seiten mit einem Script hoch und lass sie von dem Script an die entsprechenden stellen schreiben. Dann kannst Du sie mit dem Administrationsscript bearbeiten. Es ist ganz egal wer dann dort eingeloggt ist, der Besitzer der von einem Script erstellten Dateien ist immer der gleiche egal von wem auf welchem Rechner mit welchem Browser oder sonstwie über http das Script aufgerufen wurde!!!

Bei Zope läuft das Ganze noch etwas komplexer ab. Da Du dort ja auch Benutzer anlegen kannst die beim Login erkannt werden und die Objekte dann demjenigen zugeordnet werden. Wei kommst Du jetzt überhaupt auf Zope, ich dachte du machst das mit eigenen Scripten?

Wenn Du aber etwas per ftp hochlädst ist der Eigentümer und die Gruppe ein anderer als wenn ein Script die Datei angelegt hat. Kannst Du schön in einem guten FTP-Programm wie gFTP sehen, dort werden auch die Eigentümer und Gruppen der Dateien und Verzeichnisse angezeigt.


Gruß

Dookie

Verfasst: Mittwoch 14. April 2004, 18:42
von Gast
aha, es dämmert!

ich habe das etwas anders verstanden. schreiben ist nicht immer die beste form der kommunikation :D

das mit zope war nur ein bsp. was ich machen will, also so ähnlich eben.

mfg

rolgal

Verfasst: Mittwoch 14. April 2004, 18:48
von Dookie
rolgal hat geschrieben:aha, es dämmert!
na endlich ;)
ich habe das etwas anders verstanden. schreiben ist nicht immer die beste form der kommunikation :D
Naja, wenn man aufmerksam liest und mal das interpretieren weg lässt. Ich weiss, das ist für nen Menschen schwerer als für einen Computer ;)
das mit zope war nur ein bsp. was ich machen will, also so ähnlich eben.
Na Zope ist schon eine ganz andere Baustelle.
mfg

rolgal

Gruß

Dookie

Verfasst: Mittwoch 14. April 2004, 19:08
von Gast
hi dookie!

ich meinte ja nur ich will diese funktion, des online editierens auf meiner seite nutzen können, so wie das u.a. auch mit zope möglich ist.

das anlegen lassen mit dem skript und dann das runterladen hat mal nicht geklappt.

mal sehen, ob ich selber draufkomme.

mfg

rolgal

Verfasst: Mittwoch 14. April 2004, 19:22
von Gast
so, das mti ftp ging mir jetzt so auf die eier, dass ich mal was anderes probiert habe, spricht was gegen diese methode?

es klappt mal, dass es so ausgegben wird wie geplant. mal sehen was der upload für troubles mit sich bringt:

Code: Alles auswählen

#!/usr/local/bin/python

from seiten import AdminSeite
import  urllib2

content=urllib2.urlopen('http://diplomarbeit.weberanto.net/definition.htm').read()
admin=AdminSeite(content)
print admin
mfg

rolgal

Verfasst: Mittwoch 14. April 2004, 22:30
von Gast
nochmal....

alles theoretisch kapiert. ich kann aber vom browser aus keine datei am server anlegen, weil ich einen permission denied bekomme!

wie soll ich auch rechte einer datei übergeben, die ja nicht angelegt werden kann, weil ich nicht darf :?:

mfg

rolgal

Verfasst: Mittwoch 14. April 2004, 23:24
von Dookie
Das liegt aber nicht an den Rechten der Datei, sondern an den Rechten des Verzeichnisses.
Wenn das Verzeichnis die Rechte 0755 hat dann kannst Du mit cgi darin keine Dateien oder Verzeichnisse anlegen. Leider lassen sich die Rechte vom Wurzelverzeichnis bei einigen Providern auch nicht ändern. So musst Du ein Verzeichnis anlegen mit den Rechten 0777 und darin kannst Du mit dem Script dann Dateien und Unterverzeichnisse anlegen. Bei vielen Providern geht das nur im Verzeichnis cgi-bin.

Sicherheit hat halt ihren Preis.


Gruß

Dookie

Verfasst: Mittwoch 14. April 2004, 23:52
von Gast
hi dookie!

soweit funktioniert es jetzt mal, die rechte konnte ich schon setzen, ich habe....ach egal.


Code: Alles auswählen

#!/usr/bin/env python

import cgi, ftplib, os, sys

form=cgi.FieldStorage()

content=form.getvalue('user_eingabe')

os.chdir(os.environ['DOCUMENT_ROOT'])
f=file('index6.htm','w')
f.write(content)
f.close()

ftp=ftplib.FTP('meinserver','meinuser','meinpasswort')
ftp.cwd('html/crossover/diplomarbeit')

ftp.storlines('STOR index6.htm',file('index6.htm','r'))
ftp.quit()
momentan wird das skript auf meinem lokalen server ausgeführt, d.h. er legt in /var/www/html ein fileobjekt an, das er dann per ftp überträgt. läuft es dann am richtigen server, dann legt er mir die datei zuerst auch im /html verzeichnis ab. d.h. ich habe die dann immer doppelt. geht das nicht eleganter?

Verfasst: Donnerstag 15. April 2004, 00:30
von Dookie
Hi rolgal,

hmm, warum lädst du es erst wieder mit ftp hoch, du kannst ja Dateien über ein html-Formular mit der Methode post hochladen. das landet dann irgendwo im /tmp verzeichnis von wo aus es mit dem Script an die richtige Stelle kopiert wird.
Deine Lösung kommt mir irgendwie vor, wie: "Von hinten, durch die Brust, ins Auge".

Wenn du es aber mit der ftplib machen willst/musst, kannst du dir das Zwischenspeichern in eine Datei auch sparen. Dafür gibts das Modul StringIO

Code: Alles auswählen

#!/usr/bin/env python

import cgi, ftplib
from StringIO import StringIO

form=cgi.FieldStorage()

content=form.getvalue('user_eingabe')

ftp=ftplib.FTP('meinserver','meinuser','meinpasswort')
ftp.cwd('html/crossover/diplomarbeit')
ftp.storelines('STOR index6.htm',StringIO(content))
ftp.quit()
nicht getestet, sollte aber klappen.


Gruß

Dookie