PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datei erstellen: User = wwwrun ?



~Gh05t~
20-01-2003, 22:26
Hiho,
ich hab n kleines problem...
Ich hab n script das ne datei erstellt, nur leider für den benutzer wwwrun, nicht für meinen.
Liegt das an meinem PHP script?
Das prob ist, das ich so keine möglichkeit habe diese Datei via FTP zu editieren (weil sie mir nicht gehört...)
Kann mir da jemand helfen?

SeCa
21-01-2003, 12:22
könntest dich in die gleich benutzergruppe wie wwwrun eintragen und dann der Gruppe erlauben die daten zu ändern (-rw-rw----). Aber ich glaube das wäre ein ziemliches sicherheitsloch!
Sollte sicher auch einfacher gehen, fällt mir nur jetzt gerade nicht ein!

~Gh05t~
21-01-2003, 12:55
neee, das is ne doofe idee...
Wie läuft das normal, ich denke mal ich bin nicht der einziege Admin euf dessen System dateien von scripten erstellt werden sollen, oder?
und ich habe ehrlich gesagt keinen bock auch "chmod -R 777 *"... :rolleyes:

mehlvogel
21-01-2003, 17:44
Um was handelt es sich denn (in etwa)? Der User wwwrun wird der PHP User sein - in dessen Namen PHP läuft und dem im Linux System die Rechte entsprechend gegeben werden. Ich denke du wirst nen etwas großzügigen chmod angeben müssen. Ansonsten ist das Linux System nämlich sehr sicher.

Moment mir fällt grad nochwas ein. Entweder du baust ein PHP Skript zum editieren der Datei, oder du probierst es mit den FTP Funktionen (http://de3.php.net/manual/en/ref.ftp.php) aus PHP, um die Datei zu speichern. Dann gehört sie dir, da der FTP Server die Dateianliegt und es dann "dein" Benutezr ist. Dazu muss PHP aber entsprechend kompiliert worden sein.

~Gh05t~
21-01-2003, 22:09
hmmm.... ne, FTP fällt weg wegen is nicht... :D
Das prob ist, das das auch auf systemen laufen muss, die nicht ICH konfiguriert habe... d.h. auf allen normalen webservern.
Wie ist denn da normalerweise die Vorgehensweise?

~Gh05t~
21-01-2003, 22:49
Original geschrieben von mehlvogel
Um was handelt es sich denn (in etwa)?
Es handelt sich um eine Image-Galerie.
Einfach ne Übersichtsseite + Detailansicht mit vor und zurück Funktion und nem kommentar.
Die Bilder werden dynamisch aus einem verzeichnis gelesen.
Für die Kommentare will ich jetzt eine Datei anlegen im Format


bildname.jpg=Kommentar

Das script soll diese Datei selber generieren falls die noch nicht vorhanden ist und die dateinamen schon reinschreiben, damit man nur noch das Kommentar eintragen muss.
Und das erstellen dieser Datei macht Probleme, da man zum eintragen der Kommentare keine Rechte über FTP hat...
Ich kann das script ja ma posten.
Ist zwar noch nicht ganz fertig, aber man kann es schon benutzen:


<?
# index.inc.php
#-------------------------
$image_dir = "images";# Verzeichnis zu den Images, ausgehend von dem DIR der includierenden Datei. ( KEIN "/" am Ende!)
$image_overview_width = "200";# breite der Bilder in der Uebersicht
$image_overview_height = "200";# hoehe der Bilder in der Uebersicht
$image_overview_per_line = "3";# Anzahl der Bilder pro Zeile in der Uebersicht
$kommentar_file = "kommentare.txt"; # Kommentardatei, pfad ausgehend von der includierenden Datei
#-------------------------
$path=substr(strrchr(getenv("SCRIPT_NAME"),"/"),1);
$query = getenv("QUERY_STRING");
$query = explode("&",$query);
$querys = array();
foreach($query as $var)
{
$var = explode("=",$var);
array_push($querys, $var[0]);
}
if(opendir($image_dir)){
$hdl = opendir($image_dir);
$images = array();
while($var = readdir($hdl))
if(stristr($var,".jpg") || stristr($var,".gif"))
array_push($images,$image_dir."/".$var);
closedir($hdl);
if(file_exists($kommentar_file))
{
$datei = fopen($kommentar_file,"r");
while(!feof($datei))
{
$zeile = fgets($datei,2048);
$values = explode("=",$zeile);
$values[0] = $image_dir."/".$values[0];
$$values[0] = $values[1];
}
fclose($datei);
}
/*
# Hier liegt mein Problem!
else
{
$datei = fopen($kommentar_file,"w");
foreach($images as $image)
fwrite($datei, $image."=\n");
fclose($datei);
}
*/
if(isset($id) && $id<=count($images) && $id>=0)
{
$x = $id;
$y = $id;
if($x-- > 0) $down = $x;
else $down = $id;
if($y++ < count($images)-1) $up = $y;
else $up = $id;
#echo "Bild-#ID = ".$id."<br>\n";
echo "<p align=\"center\"><img src=\"$images[$id]\" border=0><br>\n";
echo "<br>".$$images[$id]."\n";
echo "<br><a href=\"".printquery("id")."id=".$down."\">Zur&uuml;ck</a>\n";
echo "&nbsp;&nbsp;";
echo "<a href=\"".printquery("kill id")."\">Home</a>\n";
echo "&nbsp;&nbsp;";
echo "<a href=\"".printquery("id")."id=".$up."\">N&auml;chstes</a>\n";
}
else
{
$action=NULL;
$i = 0;
$x = NULL;
echo "<table border=0>\n";
foreach($images as $image)
{
if(!$x) echo "<tr>";
echo "<td><a href=\"".printquery("id")."id=$i\">
<img src=\"$image\" height=\"$image_overview_height\" width=\"$image_overview_width\" border=0></a></td>\n";
if($x == $image_overview_per_line-1)
{
echo "</tr>\n";
$x = NULL;
}
else $x++;
$i++;
}
echo "</table>\n";
}
}
else echo "<p><h1>FEHLER!</h1><br><ul><h3>Verzeichnis $image_dir nicht gefunden!</h3></ul></p>\n";

# Ueber diese FKT bitte nicht lachen, ich habe sie voellig unstrukturiert
# geschrieben und einfach hier und da das noetige angehaengt.
# Das geht bestimmt einfacher, im mom funced das aber.
function printquery($uebergabe)
{
global $querys, $path;
$nokill = NULL;
$x = NULL;
$toadd = explode(",",$uebergabe);
foreach($toadd as $y) if($y && !stristr($y,"kill")) $nokill = TRUE;
foreach($querys as $a) global $$a;
foreach($querys as $var)
{
if($var){
$break=FALSE;
if($x)
if(stristr($x,$var))
$break=TRUE;
foreach($toadd as $b)
{
trim($b);
if(stristr($b,$var) && (stristr($b,"kill") || $b == $var))
$break = TRUE;
}
if(!$break)
{
if(!$x) $x = "?";
if($x == "?") $x .= $var."=".$$var;
else $x .= "&".$var."=".$$var;
}
}
}
if($nokill && $x) return $path.$x."&";
elseif($nokill && !$x) return $path."?";
elseif($x && !$nokill) return $path.$x;
else return $path;
}

?>

So, über die funktion printquery bitte mal gekonnt hinwegsehen (über den Rest auch? :rolleyes: ), die is glaue n bissl zu aufwendig.
Aber ich brauchte normale Links, is so gefordert worden von dem für den ich das script mache, ich kann also kein Formular nutzen.
Und da das ne include datei ist muss ich den query string einbauen.
Da ich mich mit PHP noch nit so auskenne habe ich dieses "Etwas" geschrieben, ich gebe zu das da nicht die spitze ist.

Aber ich habe auf dem Server auf dem das laufen soll kein MySQL,
von daher muss ich die Kommentare in ne datei schreiben.
Und ich will generell wissen wie das funced.
thx

PS: Ich nehme gerne verbesserungsvorschläge für das script an, kann nur besser werden... :D

mehlvogel
22-01-2003, 09:27
Zu deinem Problem. Es scheint als wenn du keine Schreibrechte in dem Verzeichnis hättest. (also brauchst du zumindest 0755 in dem Verzeichnis) und dehalb keine Datei anlegen kannst (wenn die Datei noch nichts existiert wird sie bei fopen(.., "w") erstellt.

Generell solltest du mit dem "w" aufpassen, denn wenn in der Datei was steht, wird sie dadurch gelöscht. Besser "a" benutzen (siehe Dokumentation (http://de3.php.net/fopen)). Beim erstellen der Datei musst du auch mindestens die Rechte 0755 vergeben - sonst kann dort nicht drin geschrieben werden. Ich glaube die FTP Methode wäre zu langsam für das Skript. Jetzt noch einen kleinen Kommentar zu dem Skript ansich:



$query = getenv("QUERY_STRING");
$query = explode("&",$query);
$querys = array();
foreach($query as $var)
{
$var = explode("=",$var);
array_push($querys, $var[0]);
}


Das kannst du dir sparen. Die Übergebenen Variablen stehen schon in dem Array $_GET. Und zwar genauso wie du sie in $querys speicherst. Für eine Überprüfung wie du sie unten machst:



if(!$x) echo "<tr>";
echo "...";
if($x == $image_overview_per_line-1)
{
echo "</tr>\n";
$x = NULL;
}
else $x++;


Hierfür würde ich einfach Bool Werte nehmen.



if(!$x) echo "<tr>";
echo "...";
if($x == $image_overview_per_line-1)
{
echo "</tr>\n";
$x = false;
}
else $x = true;


Find ich persönlich besser als die Variablen mit NULL zu initialisieren.
Zu der Funktion. Wenn ich das richtig verstehe soll diese einen Link erzeugen, in dem alle Parameter angehängt werden, ohne die Parameter die du übergibst? Und wenn du "kill" vor dem parameter übergibst, soll sie ganz gelöscht werden? Okay:




function printquery($uebergabe) {
$kill = false;
$arr = explode(", ", $uebergabe);
foreach ($arr as $val) {
if (stristr($val, "kill")) $kill = true;
if (isset($_GET[$uebergabe])) unset($_GET[$uebergabe]);
}
$string = "";
foreach($_GET as $key => $val) $string .= "&".$key."=".$val;
$string = ereg_replace("^&", "", $string); // Hier bin ich mir net sicher
if ($string != "") {
if (!$kill) $string .= "&";
$string = $path."?".$string
}
return $string;
}



Das ist jetzt nur ein verbesserungsvorschlag und ich weis nicht, ob er komplett so funzt wie du das möchtest, aber so ist es doch schneller, denk ich ;)

Alex_K
22-01-2003, 10:57
gleiches problem hatte ich auch mal mit meinem webspace.
das ist eine (meiner meinung) schlechte konfiguration vom provider.
bei mir hat eine einfache email gereicht und dann hatte ich auch schreibreichte (mit ftp) auf dateinen die von wwwrun erzeugt wurden ...

~Gh05t~
22-01-2003, 15:18
Hmm...
Darüber bin ich gerade im bei www.linuxforen.de ne Diskussion am führen...
So einfach ist das anscheinend nicht, denn schreibrechte für wwwrun stellen ein nicht ganz unerhebliches Sicherheitsrisiko dar.
In wie fern man das Problem jetzt lösen kann... keine Ahnung, ich habe das Gefühl, dass das überhaupt nicht geht.
Aber wie macht Perl das?
Bei Perl werden Dateien doch auch von dem User angelegt dem das script gehört...
Warum kann PHP das nicht? Is diese Sprache so beschränkt lame oder woran liegt das?

The Unknown
22-01-2003, 15:47
Ghost:

wenn du deine php-skripte übers php-cgi startest, sollten sie auch dem benutzer zugewiesen werden. In vielen Fällen ist PHP aber als Modul kompiliert, wobei es die den Benutzer des Indianers nimmt.

Ich nehme an wenn man einen Apache-Server mit mod_perl ausstattet, bekommen solche php-files auch den User des Servers?

mehlvogel
22-01-2003, 17:42
Ich würde drauf tippen das Perl die Dateien einfach anders chmod'ed. PHP ist auch nicht lame - es richet sich genauso an das Linuxfilesystem wie Perl. Musst die Dateien halt anders mit Rechten ausstatten. Weis gar net was so schlimm darin wäre wenn du die Dateien mit 0755 belegst? Zur Not musst du per PHP und exec (http://de3.php.net/exec) die Datei anders chown'en - fertig.

~Gh05t~
22-01-2003, 18:51
Nein, ich weigere mich dateien für den Webuser anzulegen die mehr Rechte haben als 644. 755 bringt mir sowieso nix, das macht die erstellten dateien auch noch ausführbar, schreiben kann ich die immer noch nicht. Wenn brauche ich 766 oder 777(verzeichnisse müssen ausführbar sein), letzteres würde jedem der meine Homepage öffnet ermöglichen diese Datei zu editieren und auszuführen.
Ich habe mod_perl installiert. Zu Testzwecken habe ich mal zwei identische Scripte geschrieben. Eins in Perl, eins in PHP:


<?php
echo "Datei wird erstellt...\n";
$datei = fopen("test_1.txt","w");
fwrite($datei, "test\n");
fclose($datei);
?>



#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Datei wird erstellt...\n";
open(DATEI, ">test_2.txt");
print DATEI "test\n";
close(DATEI);

Da der PHP script noch nicht mal ne datei erstellen kann muss ich die chmods von dessen Verzeichnis auf 777 setzen. Danach erstellen beide Dateien eine Test.txt:


gh05t@wnz-server:~/public_html/php-dir> l
insgesamt 16
drwxrwxrwx 2 gh05t users 4096 Jan 22 19:35 ./
drwxr-xr-x 9 gh05t users 4096 Jan 22 19:34 ../
-rw-r--r-- 1 gh05t users 117 Jan 22 19:35 test.php
-rw-r--r-- 1 wwwrun nogroup 5 Jan 22 19:35 test_1.txt



gh05t@wnz-server:~/public_html/cgi-bin> l
insgesamt 16
drwxr-xr-x 2 gh05t users 4096 Jan 22 19:34 ./
drwxr-xr-x 9 gh05t users 4096 Jan 22 19:34 ../
-rwxr-xr-x 1 gh05t users 164 Jan 22 19:32 test.pl*
-rw-r--r-- 1 gh05t users 5 Jan 22 19:34 test_2.txt

Dies zum Thema perl modifiziert irgendwelche chmods. Der einziege unterschied ist, das das Perlscript im CGI-BIN Verzeichnis läuft, was man von dem PHP script nicht behaupten kann, da man die chmods des cgi-bins nicht auf 777 stellen KANN (sonst kann man auf keine dateien darin mehr zugreifen).

Für mich ist das n eindeutiger Pluspunkt für Perl.
Warum ist das nicht auch für php Standart?
Es wäre doch so einfach, ohne Sicherheitsrisiko:
Man müsste einfach alle von einem Script (also localhost) erstellten Dateien einem anderen User zuordnen.
Da ein Besucher der Seite keinen Zugriff auf das script hat (schreiben) kann er nicht bestimmen was in diese Datei geschrieben wird. Das einziege was er kann ist die Datei anzeigen (chmod 644). Damit wäre das genau so gelöst wie in Perl und keiner hätte ein Problem.
Oder habe ich da was übersehen?

mehlvogel
22-01-2003, 20:39
Weil das nunmal als Apache Modul kompiliert ist (d.h. es ist Apache Quelltext, der PHP Interpreter), und deshalb als Apache User läuft (wwwrun). Änderst du diesen User auf Gho5t - oder auf was weiß ich - dann könnten wieder alle Leute auf deien Dateien lesend, schreibend, ausführend zugreifen. Perl ist wohl anscheined kein richtiges Apache Modul, oder was weis ich - ich benutze Perl nicht - weil es für mich zu viele EInschränkungen und ne Scheiß Syntax hat. Übrigens: fopen Manual Eintrag ERSTER User Eintrag



If you're running PHP as apache module, it will always write files as "nobody", "www", "httpd", (or whatever user your webserver runs as) unless you specify a different user/group in httpd.conf, or compile apache with suexec support.
However, if you run PHP as a CGI wrapper, you may setuid the PHP executable to whatever user you wish (*severe* security issues apply). If you really want to be able to su to other user, I recommend compiling with suexec support.
AFAIK, PHP can't NOT use SuEXEC if apache does. If PHP is configured as an apache module it will act as whatever user the apache is. If apache SuEXEC's to otheruser:othergroup (e.g. root:root), that's what PHP will write files as, because it acts as a part of apache code. I suggest you double-check your SuEXEC configuration and settings. Note: you can't su to another user within the PHP code -- it has to be an apache directive, either through <VirtualHost>, or through .htaccess. Also note: I'm not sure how it all works (if it works at all) on Win32 platforms.
Check www.apache.org to see how it's done.


Aber vielleicht hilft dir das weiter Link (http://de3.php.net/manual/en/function.chown.php) Oder Link (http://de3.php.net/chmod) oder Link (http://de3.php.net/chgrp)

Oder du schreibst dir einfach nen PHP Skript zum Eintragen der Kommentare (fände ich viel zu lästig das alles über FTP zu machen). Oder du benutzt einfach das SuperPerl....

~Gh05t~
22-01-2003, 21:32
Also, da ich scripte schreiben will die auf allen Servern laufen werde ich auf Eingriffe in mein System verzichten. Genau so werde ich auf das erstellen von Dateien mit PHP verzichten, den Vorteil in dieser Sprache sehe ich NUR in DB basierenden Scripten.

Aber wo wir gerade bei DBs sind:
Wie speichere ich denn die Verbindungsdaten zu einer MySQL datenbank? (User:PW)
Ich meine jetzt OHNE selber in den Quellcode zu gehen und OHNE dir chmods in unendliche höhen zu treiben?
Es gibt genug scripte (meist Foren) die über ein PHP script bequem installiert werden können. Wie funktioniert das? Ich erstelle doch da auch kein Verziechnis mit chmod 777 oder ändere die chmods der configdatei auf 666...

mehlvogel
23-01-2003, 13:00
Also bei meinen Scripts wird eine leere Datei mitgeliefert und diese muss mind. 755 haben - dann werden die Daten dort reingeschrieben. Bei Avataren oder dynamischen Smiley System ist es dasselbe.

(Oder besser man muss in dem Verzeichnis / Datei schreiben dürfen - um das zu prüfen gibt es eine ganz einfache Methode).

Gaert
23-01-2003, 13:22
Das mit der leeren Datei kapier ich nicht ganz...
Du öffnest die Datei (rechte hast du ja mit 755), schreibst rein... und dann?
Was machst du dann mit den Daten die da drin stehen?

mehlvogel
23-01-2003, 13:30
Bei dem Skript ist z.B. eine Datei config.inc.php bei. Diese ist leer. Diese Datei bracuh für die Installation die 0755 Rechte. Dann wird in die Datei die Config Daten geschrieben, die der User eingibt (als PHP Code z.B:


<?php
$db = "localhost";
$name = "name";
$pw = "pw";
/* noch mehr variablen */
?>

) dann wird die Datei geschlossen. Fertig. Dann kann die Datei wegen meiner ruhig wieder engere Rechte kriegen (so das man halt noch lesend drauf zugriefen kann). Oder gibt es dort andere Möglichkeiten?

~Gh05t~
23-01-2003, 17:44
Also ich weis nicht WAS es für möglichkeiten gibt, aber ich habe neulich das Burning-Board v1.2 auf nem server installed. Diese schöne Board war folgendermaßen zu installieren:
Dateien per FTP auf den Server laden, install script starten, konfigurieren, fertig.
Nix von wegen chmods ändern. Trotzdem hat die Datei chmod 777 gehabt (die config datei die die MySQL + email-addy des admin speichert).
Kann man das mit exec() oder system() machen?

mehlvogel
23-01-2003, 18:57
Da man die Datei auf seinem eigenen Rechner schreibt - (man muss von Hand die Daten eintragen) - dann kann man das natürlich lassen. die restliche Config hat ja nur was mit der DB zu tun.