[PHP] fopen und Safemode

27o8

abgemeldet
2 Mai 2006
9.028
933
Hallo,
habe ein Problem ;) ich würde gerne einen Zip-Ordner hochladen dann in dem Verzeichnis $dir einen Ordner mit dem Namen des Zipverzeichnis erstellen also wenn es gremlin.zip war soll in $dir der ordner gremlin erstellt werden. Nach $dir wird die hochgeladene Zip Datei erstmal kopiert, und dann von dort aus nach /gremlin/ entpackt.
PHP:
function unzip($zipfile,$unzip_path)
{
    $zip = zip_open($zipfile);
    while ($zip_entry = zip_read($zip))    {
        zip_entry_open($zip, $zip_entry);
        if (substr(zip_entry_name($zip_entry), -1) == '/') {
            $zdir = substr(zip_entry_name($zip_entry), 0, -1);
            if (file_exists($unzip_path.'/'.$zdir)) {
                trigger_error('Directory "<b>' . $zdir . '</b>" exists', E_USER_ERROR);
                return false;
            }
            mkdir($unzip_path.$zdir);
        }
        else {
            $name = zip_entry_name($zip_entry);
            if (file_exists($unzip_path.$name)) {
                trigger_error('File "<b>' . $name . '</b>" exists', E_USER_ERROR);
                return false;
            }
            $fopen = fopen($unzip_path.'/'.$name, "w");
            fwrite($fopen, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)), zip_entry_filesize($zip_entry));
        }
        zip_entry_close($zip_entry);
    }
    zip_close($zip);
    return true;
}


#############################

$message = '';
if (isset($_POST['checkUpload'])){
  if (substr( strtolower( strrchr($_FILES['datei']['name'], '.') ), 1 ) == 'zip'){
    if(is_uploaded_file($_FILES['datei']['tmp_name'])){
      # verschieben
      move_uploaded_file($_FILES['datei']['tmp_name'], $dir.$_FILES['datei']['name']);
      # chmod setzen
      chmod($dir.$_FILES['datei']['name'],0777);
      # zip Datei entpacken
      mkdir($dir.str_replace('.zip','',$_FILES['datei']['name']),0777);
      unzip($dir.$_FILES['datei']['name'],$dir.'/'.str_replace('.zip','',$_FILES['datei']['name']));
       $message = 'Upload Erfolgreich';
    }else{
      $message = 'Fehler beim hochladen der Datei';
    }
  }else{
    $message = 'Nur Zip-Archive erlaubt!';
  }
}

if ($message) echo $message;

Allerdings zickt dort Safemode :p
Warning: fopen() [function.fopen]: SAFE MODE Restriction in effect. The script whose uid is 647 is not allowed to access /var/www/web1/html/vms.designerscripte.net/module/gremlin owned by uid 33 in /var/www/web1/html/gremlin/lib/extras.lib.php on line 113

Warning: fopen(../module/gremlin/module.php) [function.fopen]: failed to open stream: No such file or directory in /var/www/web1/html/gremlin/lib/extras.lib.php on line 113

Warning: fwrite(): supplied argument is not a valid stream resource in /var/www/web1/html/gremlin/lib/extras.lib.php on line 114

Bedeutet ja soviel wie das mein Script von Userid 647 nicht auf den Ordner von Userid 33 zugreifen soll, stimmts? Aber wie änder ich das? Ich erstelle doch den ordner vorher mit mkdir(); und mache direkt danach mit unzip(); das andere, ist die selbe php Datei (abgesehen von der Funktion unzip() die wird im Original includet).

Bin über jeden Tipp dankbar ;)

Gruß
Gremlin
 
Hallo,
diese Rechte vergebe ich doch schon mit:
PHP:
mkdir($dir.str_replace('.zip','',$_FILES['datei']['name']),0777);

ich habe jedoch danach nochmal eine Zeile:

PHP:
chmod($dir.str_replace('.zip','',$_FILES['datei']['name']),0777);

eingefügt, allerdings kommt trotzdem die Fehlermeldung. :-?
 
Safemode ebend... das Problem ist dass der Ordner vom Webserver erstellt wird und nicht von "dir", damit hat der Safemode ebend ein Problem. Entweder erstellst du den Ordner per FTP, aber das Problem wird spätestens wieder auftauchen wenn du auf die entpackten Dateien zugreifst.

Ich würde wohl den Hoster wechseln. Safemode ist jetzt nicht wirklich etwas was von der Fähigkeit des Hosters zeugt. Die Sicherheit kann man auch ganz primitiv anders erreichen ohne derartige Einschränkungen. Von daher ist das eher ein Anzeichen dass der Hoster nicht wirklich ahnung hat was er da macht...
 
XFuture-Media.de ein ziemlich kompetenter Hoster bislang nie Probleme mit gehabt ;).

Das ist meine Meinung. Wenn der Hoster meint es sei sinnvoll dann soll er es so machen. Mich gewinnt er damit nicht als Kunden ;) Aus Hoster sicht wäre für mich der Safemode eine absolut einfache und billige Art den Server "sicher" zu machen. Aber als Kunde heißt das für mich der Hoster ist mehr an quantität als quallität interessiert und dafür bin ich eindeutig der falsche Kunde. Weil ich absolut keine lust auf solche Probleme hab wie deine oben geposteten. (Safemode macht das erstellen von neuen Datein absolut unmöglich bzw umständlich (umweg per ftp))

Prinzipiell kann man die Sicherheit die einen der Safemode bietet auch mit der open_basedir und disable_functions Direktive erreichen. Alternativ wenn man den Safemode warum auch immer nutzen will gibts auch Module wie suPHP... dann gehöhrt der angelegte Ordner/Datzei auch dem richtigen Benutzer. Oder ein ganz anderer Ansatz wäre zb php als cgi laufen zu lassen... damit kann man den erfahrenen Kunden sogar einen mehrwert bieten wie zb einen eigenen php.ini. (bringt aber andere Nachteile)

Gremlin schrieb:
Also anders kann man es nicht lösen? Abgesehen von FTP

Aus programmiertechnischer sicht nicht wirklich, auf das Problem hat man aus dieser Ebenen kein einfluss. Du kannst natürlich den Hoster anschreiben und versuchen mit ihm eine Lösung zu finden, was bei kleineren Hostern durchaus möglich ist.
 
Nunja ist ja nicht unbedingt nur für mich gedacht, sollte ein gratis Addon für ein Script werden, und da stieß ich halt auf das Problem :p und ein Addon sollte ja dann auch unter Safemode laufen aber ich lass mir mal was einfallen :D

Danke schonmal.

Gruß
Gremlin
 
Nunja ist ja nicht unbedingt nur für mich gedacht, sollte ein gratis Addon für ein Script werden, und da stieß ich halt auf das Problem :p und ein Addon sollte ja dann auch unter Safemode laufen aber ich lass mir mal was einfallen :D

Manuelle Installation... ist ja nicht wirklich ein Problem, jedenfalls solang man mit nem FTP Progamm umgehen kann ;)
 
Ja :biggrin: manuelle Installation ist im moment schon drin, sollte halt nur was sein wodurch man mit zwei Klicks ein Modul installieren kann (1 Klicks fürs hochladen und entpacken vom Zip Ordner, zweiter Klick für Modulinstallation :p) sollte man halt alles aus dem Adminbereich erledigen können....

Confixx bietet doch auch WebFTP an, wo ist da denn der unterschied wenn ich damit einen Ordner erstelle? 8O

Gruß
Gremlin
 
Confixx bietet doch auch WebFTP an, wo ist da denn der unterschied wenn ich damit einen Ordner erstelle? 8O

Gruß
Gremlin

Rat mal warum das WebFTP heißt ;) Du hast einfach nur ein FTP Client der mit einer HTML Oberfläche daher kommt. Da passiert also nix anderes als wie der Workaround mit FTP...
 
Hmm okay, das war mir nicht bewusst ;) dachte es hiese nur so weil es ein Ersatz für FTP Programm ist *hehe* :)