Datei Upload über den Browser - Fehler
Mario
- php
Guten Morgen zusammen,
ich habe folgendes Formular:
<form enctype="multipart/form-data" action="upload.php" method="post">
<input name="file" type="file"><br>
<input type="submit" value="hochladen">
</form>
Die Datei upload.php sieht folgendermaßen aus:
<?php
$tempname = $_FILES['file']['tmp_name'];
$name .= $_FILES['file']['name'];
$type = $_FILES['file']['type'];
$size = $_FILES['file']['size'];
if($type != "image/gif" && $type != "image/pjpeg") {
$err[] = "nur gif und jpeg Dateien dürfen hochgeladen werden.";
}
if($size > "15000") {
$err[] = "Die Datei welche du hochladen willst, ist zu gross!<br>Maximale Dateigrosse beträgt 15 KB!";
}
echo $name;
If(empty($err)) {
copy("$tempname", "$name");
echo "Die Datei $name wurde erfolgreich hochgeladen!";
}
else {
foreach($err as $error)
echo "$error<br>";
}
?>
Und hier die Fehlermeldung vom Server:
hamster.jpg
Warning: copy(hamster.jpg): failed to open stream: Permission denied in /var/www/web98/html/admin/werbung/upload.php on line 18
Die Datei hamster.jpg wurde erfolgreich hochgeladen!
Ich habe das Skript aus einem Tutorial, ein anderes hatte ähnliche Fehlermeldungen. Was könnte da schiefgelaufen sein? Wäre für jede Hilfe sehr dankbar!
Nächtliche Grüße aus Ulm!
Mario.
Hello Mario,
Dein Script enthält die verschiedensten Fehlerquellen und Gefahrenpotentiale. Ich versuche mal, darauf einzugehen:
ich habe folgendes Formular:
<form enctype="multipart/form-data" action="upload.php" method="post">
<input name="file" type="file"><br>
<input type="submit" value="hochladen">
</form>
Die Datei upload.php sieht folgendermaßen aus:
<?php
$tempname = $_FILES['file']['tmp_name'];
$name .= $_FILES['file']['name'];$type = $_FILES['file']['type'];
$size = $_FILES['file']['size'];
if($type != "image/gif" && $type != "image/pjpeg")
{
$err[] = "nur gif und jpeg Dateien dürfen hochgeladen werden.";
}
if($size > "15000")
{
$err[] = "Die Datei welche du hochladen willst, ist zu gross!<br>Maximale Dateigrosse beträgt 15 KB!";
}echo $name;
If(empty($err))
{
copy("$tempname", "$name");
## $cpok=copy($tempname, $path."/".$name);
## if (!cpok)
{
$err[] = "Fehler beim Kopieren der Datei.";
}
else
{
$err[] = "Datei wurde kopiert";
}
}
{
foreach($err as $error)
echo "$error<br>";
}
?>Und hier die Fehlermeldung vom Server:
hamster.jpg
Warning: copy(hamster.jpg): failed to open stream: Permission denied in /var/www/web98/html/admin/werbung/upload.php on line 18
Die Datei hamster.jpg wurde erfolgreich hochgeladen!
Entweder durfte der Apache mit dem copy()-Befehl die Quelle nicht öffen oder das Ziel nicht anlegen oder sogar beides. Zweiteres ist wahrscheinlicher. Der Webserver (PHP) muss im Zielverzeichnis Schreibrechte haben.
Viele Grüße nach Ulm
Tom
Hallo
Entweder durfte der Apache mit dem copy()-Befehl die Quelle nicht öffen oder das Ziel nicht anlegen oder sogar beides. Zweiteres ist wahrscheinlicher. Der Webserver (PHP) muss im Zielverzeichnis Schreibrechte haben.
In dem Zusammenhang überprüfe ob PHP im Safe_Mode läuft.
Weitere Möglichkeit:
Die Schreibrechte mußt Du richtig setzen.
Also gesetzt den Fall, Du hast den Ordner mit FDP Angelegt, der PHP nutzer ist anders als der FTP Nutzer.
Dann mußt Du das Verzeichniss auch für alle beschreibbar machen.
Stichwort chmod.
Zu den Sicherheitsaspekten hat Dir der Tom ja schon was geschrieben.
Viele Grüße Tom
Hello,
In dem Zusammenhang überprüfe ob PHP im Safe_Mode läuft.
Weitere Möglichkeit:
Das hätte aber eine andere Fehlermeldung gegeben.
Die Schreibrechte mußt Du richtig setzen.
Also gesetzt den Fall, Du hast den Ordner mit FDP Angelegt, der PHP nutzer ist anders als der FTP Nutzer.
FDP Members sind immer anders als andere *gg*.
Dann mußt Du das Verzeichniss auch für alle beschreibbar machen.
Stichwort chmod.
Lieber das Verzeichnis und die Files an den Apachen (Username häufig "wwwrun" oder "apache") verschenken mit chown. Nur dazu brauchst Du Root Rechte und eine ssh-Konsole. Mit telnet geht das auch, möchte ich Dir aber nicht wünschen, dass Du telnet-Zugang hast.
Grüße
Tom
Lieber das Verzeichnis und die Files an den Apachen (Username häufig "wwwrun" oder "apache") verschenken mit chown. Nur dazu brauchst Du Root Rechte und eine ssh-Konsole. Mit telnet geht das auch, möchte ich Dir aber nicht wünschen, dass Du telnet-Zugang hast.
Ich hab beides!
Ich hab auch durchaus Root Rechte.
Ich habe auch nur versucht Ihm eine Möglichkeit zu zeigen wie man es unter Umständen lösen kann.
Was genau gewesen ist können wir beide nicht genau sagen.
Eins ist Fakt:
Er hat ein wackliges Skript in einer für uns und scheinbar auch für Ihn unbekannten Serverumgebung benutzt.
Bei mir ist der Apache "99" *g*!
Telnet hat die Sicherheitsprobleme, aber sonst?
Thomas
Guten Morgen ihr beiden!
Vielen Dank erstmal für Eure Hilfe. Ich habe das Skript soeben wie im 1. Posting angegeben modifiziert.
Die Formseite sieht immer noch wie folgt aus: (ich weiß halt nicht, was Du mit dem Button genau meintest)
<form enctype="multipart/form-data" action="upload.php" method="post">
<input name="file" type="file"><br>
<input type="submit" value="hochladen">
</form>
Das Upload Skrip:
<?php
$tempname = $_FILES['file']['tmp_name'];
$name .= $_FILES['file']['name'];
$type = $_FILES['file']['type'];
$size = $_FILES['file']['size'];
if($type != "image/gif" && $type != "image/pjpeg") {
$err[] = "nur gif und jpeg Dateien dürfen hochgeladen werden.";
}
if($size > "15000") {
$err[] = "Die Datei welche du hochladen willst, ist zu gross!<br>Maximale Dateigrosse beträgt 15 KB!";
}
echo $name;
if (empty($err))
{
copy("$tempname", "$name");
$cpok=copy($tempname, $path."/".$name);
if (!cpok)
{
$err[] = "Fehler beim Kopieren der Datei.";
}
else {
$err[] = "Datei wurde kopiert";
}
}
foreach ($err as $error)
{
echo "$error<br>";
}
?>
Hier habe ich die Änderungen, so wie vorgestellt einfach übernommen.
Und hier die etwas ausführlichere Fehlermeldung:
bescglinie.gif
Warning: copy(bescglinie.gif): failed to open stream: Permission denied in /var/www/web98/html/admin/werbung/upload.php on line 22
Warning: copy(): open_basedir restriction in effect. File(/bescglinie.gif) is not within the allowed path(s): (/var/www/web98/) in /var/www/web98/html/admin/werbung/upload.php on line 24
Warning: copy(/bescglinie.gif): failed to open stream: Operation not permitted in /var/www/web98/html/admin/werbung/upload.php on line 24
Datei wurde kopiert
Line 22 ist der Copy Befehl, line 24 ist !cpok
Zum Thema Sicherheit: An das Skript dürfen nur autorisierte Personen, denen ich vertraue, daß sie an diese Stelle auch nur Bilder hochladen. Das ganze ist paßwortgeschützt. Ich hab das Ganze jetzt halt weggelassen, damit ich besser testen kann, was schief läuft. (momentan ist das ja so einiges... ;-)
Wäre über jede weitere Hilfe echt dankbar!
Gruß, Mario.
Meine Admins meinten, ich hätte auf jeden Fall in diesem Verzeichnis Schreibrechte. Das ist halt ein Unterverzeichnis meines normalen html Ordners. WennIhr irgendwelche phpinfo Infos brauch, bedient Euch:
http://www.projecteightynine.com/info.php
Meine Admins meinten, ich hätte auf jeden Fall in diesem Verzeichnis Schreibrechte. Das ist halt ein Unterverzeichnis meines normalen html Ordners. WennIhr irgendwelche phpinfo Infos brauch, bedient Euch:
http://www.projecteightynine.com/info.php
D.h. das Du Schreibrechte hast, das heist aber nicht das Du diese auch gesetzt hast.
Um das auszutesten setze mal das Verzeichniss auf chmod 777!
Vorsicht! ist nur zum testen ob der Fehler verschwindet.
Setze dann das Verzeichniss systematisch wieder zurück!
chmod 766 müßte reichen!
Weist Du wie?
Tom
Hello,
Hier ist was doppelt und $path ist nicht zugewiesen:
if (empty($err))
{
diese Zeile muss weg.
copy("$tempname", "$name");
$cpok=copy($tempname, $path."/".$name);
if (!cpok)
Der Rest ist so wohl OK. Aber $path muss ein Pfad innerhalb deines BaseDirs sein. Wo dein Provider das gesetzt hat, weiß ich nicht. Vielleicht kannst Du das erfragen mit ini_get("open_basedir").
Auf jeden Fall ist der Wert in phpinfo() angegeben.
Grüße
Tom
Hallo Tom,
danke, es funktioniert jetzt. Die Lösung lag darin, die Zugriffsrechte neu zu setzen. Kannst Du mir jetzt vielleicht noch nen Tip geben, wie ich per Formular die Datei löschen kann?
Gruß, Mario.
(endlich mal nicht mehr gefrustet... ;-)
Hello,
danke, es funktioniert jetzt. Die Lösung lag darin, die Zugriffsrechte neu zu setzen. Kannst Du mir jetzt vielleicht noch nen Tip geben, wie ich per Formular die Datei löschen kann?
Ja.
Da sollte man nur mit Session oder vergleichbarer Technik arbeiten.
Vergleichbar wäre, dass auf die Anforderung der Auflistung von löschbaren Dateien für den User eine Liste ausgegeben wird und diese auf dem Server unter einer ID gespeichert wird. Die ID wird dem Formular mit den Checkboxen und den Dateinamen als hidden-Field mitgeschickt.
Wenn nun eine Löschanforderung kommt, wird erst unter der ID geschaut, ob die Datei unter dem Index der Checkbox vorhanden ist. Wenn ja, kann sie gelöscht werden. Mit der Anfrage müssen auch die Einträge unter der ID auf dem Server beseitigt werden, denn jede darf nur einmal benutzt werden.
Sin der Sache sit, dass der User nicht frei entscheiden kann, welche Datei er löscht. Dann könnte er durch probieren deinen ganzen Server lahmlegen. Ein Treffer reicht vielleicht. Er bekommt eine Liste aus einem fest vorgegebenen Verzeichnis ($path) und das Verzeichnis kann er auch nicht verlassen!
Grüße
Tom