PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SafeMod und Dateiupload



Cimme
18-04-2005, 23:15
Hi miteinander,

ich habe das Problem, dass ich durch SafeMode-Restriktionen keine Dateien schreiben kann.
Ich versuche aufgrund dessen dies nun mit den PHP-eigenen FTP-Funktionen zu lösen, was aber auch nicht so funktioniert wie es sollte.

Folgender Code wird eingebunden:


class upload {

#dircheck => besteht das Verzeichnis?
function dircheck($ftpverbindung,$dir){
# prüfen wir mal ob Verzeichnis besteht!
if(is_dir($dir)){
$dirchecker = "vorhanden";
}else{
ftp_chdir($ftpverbindung,"/httpdocs/SIT/data/userimages/");
ftp_mkdir($ftpverbindung,$_COOKIE[sitlog]);
chmod($dir,0777);
# Verzeichnis angelegt
}
}

#uploadfile
function uploadfile($ftpverbindung,$datei,$verzeichnis,$zae hler) {
#erstmal die größe checken und Dateiendung
// filename muss extrahiert werden, um die Endung zu bekommen
$dname = explode(".",$datei_name);
$dnamesize = count($dname);
$datei_ext = $dname[$dnamesize-1];


$dateiname = date(dmy) . $zaehler;

# $ftpdir = ftp_chdir($ftpconnection,$verzeichnis);
$dirload = $verzeichnis . $dateiname . ".jpg";
ftp_put($ftpverbindung,$dirload,$datei,FTP_BINARY) ;

// das ganze am Besten in eine Variable packen!
$saveddatei = $makedirlink . "/" . $dateiname . ".jpg";
if(file_exists($saveddatei)) {
echo "<br>Die Datei $datei_name wurde erfolgreich gespeichert. Augrund sicherheitstechnischen Ma&szlig;nahmen wurde der Dateiname allerdings ver&auml;ndert.<br />";
}else{
echo "<p><strong>Upload gescheitert!!</strong><br /> Es wurde eine Datei angegeben, welche entweder zu groß (>650 kb) oder nicht auf die Dateiart *.jpg endet.</p>";
clearstatcache();
}
}
}

Eingebunden wird es dann wie folgt:


include("$source_dir/inserate/uploadclass.php");
// initialisiere Classe für Dateien

if($upload1=="") {
echo "Es wurde keine Datei in Dateifeld 1 zum Upload benannt. Somit wurde keine Datei hochgeladen. <br /><br />";
}else{
$fileload1 = new upload;
$fileload1->dircheck($ftpconnection,$makedirlink);
$fileload1->uploadfile($ftpconnection,$upload1,$makedirlink,1) ;

$saveddatei1 = $saveddatei;
}
if($upload2=="") {
echo "Es wurde keine Datei in Dateifeld 2 zum Upload benannt. Somit wurde keine Datei hochgeladen. <br /><br />";
}else{
$fileload2 = new upload;
$fileload2->dircheck($ftpconnection,$makedirlink);
$fileload2->uploadfile($upload2,$makedirlink,2);

$saveddatei2 = $saveddatei;
}

wobei sich das bis $fileload5 fortsetzt.

Das Formular sieht wie folgt aus:


<input type="file" name="upload1" size="25" accept="image/jpg">
<input type="file" name="upload2" size="25" accept="image/jpg">
<input type="file" name="upload3" size="25" accept="image/jpg">
<input type="file" name="upload4" size="25" accept="image/jpg">
<input type="file" name="upload5" size="25" accept="image/jpg">


Als Fehlermeldung wird folgendes ausgegeben:


Warning: ftp_mkdir(): 1: File exists in /home/httpd/vhosts/swissimmotrade.ch/httpdocs/SIT/sources/inserate/uploadclass.php on line 17

Warning: chmod(): Unable to access /httpdocs/SIT/data/userimages/1 in /home/httpd/vhosts/swissimmotrade.ch/httpdocs/SIT/sources/inserate/uploadclass.php on line 18

Warning: chmod(): open_basedir restriction in effect. File(/httpdocs/SIT/data/userimages/1) is not within the allowed path(s): (/home/httpd/vhosts/swissimmotrade.ch/httpdocs:/tmp) in /home/httpd/vhosts/swissimmotrade.ch/httpdocs/SIT/sources/inserate/uploadclass.php on line 18

Upload gescheitert!!
Es wurde eine Datei angegeben, welche entweder zu groß (>650 kb) oder nicht auf die Dateiart *.jpg endet.


Liegt es an meiner Logik oder am SafeMode?
Link zu PHPinfo (http://www.swissimmotrade.ch/SIT/phpinfo.php)

Wäre über einen Denkansatz oder einer Lösungsmöglichkeit sehr erfreut! :D

Vielen Dank schonmal!

Pingu
19-04-2005, 07:25
Hi,

hast Du Dir mal die Fehlermeldungen/Warnungen genau durchgelesen? Ist Dir dabei nichts aufgefallen?

Warning: chmod(): Unable to access /httpdocs/SIT/data/userimages/1 in /home/httpd/vhosts/swissimmotrade.ch/httpdocs/SIT/sources/inserate/uploadclass.php on line 18

Warning: chmod(): open_basedir restriction in effect. File(/httpdocs/SIT/data/userimages/1) is not within the allowed path(s): (/home/httpd/vhosts/swissimmotrade.ch/httpdocs:/tmp) in /home/httpd/vhosts/swissimmotrade.ch/httpdocs/SIT/sources/inserate/uploadclass.php on line 18
Falls es Dir noch nicht deutlich genug ist: TIP: die Basis

Außerdem was soll denn der Schmarrn:
Ich habe das Problem, dass ich durch SafeMode-Restriktionen keine Dateien schreiben kann.
Ich versuche aufgrund dessen dies nun mit den PHP-eigenen FTP-Funktionen zu lösen, was aber auch nicht so funktioniert wie es sollte.Vorallem, weil Du dann nachher in der Funktion "normale" Funktionen (is_dir(), chmod()) mit FTP-Funktionen (ftp_chdir(), ftp_mkdir()) mixed.

Setzte Deine Variablen (in diesem Falle $dir) richtig und dann geht das auch (nebenbei: eine Funktion sollte immer eindeutig sein - die Funktion heißt dircheck, gibt aber als Ergebnis nicht zurück ob es nun existiert oder nicht), z.B.:
#dircheck => besteht das Verzeichnis?
function dircheck($dir) {
# prüfen wir mal ob Verzeichnis besteht!
if(is_dir($dir)) {
return true;
} else {
return false;
}
}
#dircreate => erstelle das Verzeichnis
function dircreate($dir) {

// wir haben nix zu tun, wenn es exitiert
if ($this->dircheck($dir)) return;

chdir($dir);

// erstelle das Verzeichnis und springe mit oder ohne Erfolg zurück
return mkdir($_COOKIE[sitlog], 0777);
}


Du mußt natürlich sicherstellen, daß der Pfad in $dir innerhalb der elaubten Vezeichnisse liegt.

Pingu

EDIT: Wenn Du mit safe mode und basedir Restriktionen arbeitest, dann lege ich Dir noch zwei andere Funktionen ans Herz: move_uploaded_file() (http://www.php.net/move-uploaded-file) und is_uploaded_file() (http://www.php.net/is-uploaded-file).