Weekend_Warrior Geschrieben 9. August 2005 Teilen Geschrieben 9. August 2005 Hi, ich möchte mit HTML ein Bild hochladen und es soll geprüft werden, dass die Größe (Abmessungen und KB) und das Dateiformat den Vorgaben entspricht (ähnlich Avatarupload). Bisher habe ich das so gemacht: UpLoad im Formular <form name="file" action="profil.php" enctype="multipart/form-data" method="POST"> Neues Bild hochladen:<br> <input name="file" type="file" size="30" maxlength="1024" accept="image/jpg"><br> <input type="submit" name="Abschicken" value="UpLoad" class="button"> </form>[/PHP] PHP Code zum Speichern [PHP]if(isset($_POST["Abschicken"])) { if(filesize($file) < 10001) { //Lokal $updir = $DOCUMENT_ROOT.'/www/pics/pics'; //Internet //$updir = $DOCUMENT_ROOT.'/pics/pics'; //$test= 'Typ der Datei ist: '. filetype($file); $file_name=$U_ID.'.jpg'; @copy($file, "$updir/$file_name"); } } clearstatcache(); Nur leider funzt das nicht, ich kann alles hochladen und es kommt immer als jpg auf dem Server an und ich habe keine Ahnung, wie ich die Dateigröße sowie die Abmessungen prüfen kann. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Amstelchen Geschrieben 9. August 2005 Teilen Geschrieben 9. August 2005 u.a. mit getimagesize. dein script (zumindest der ausschnitt, den ich sehe) ist im übrigen extremst unsicher gegen angriffe. s'Amstel Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Weekend_Warrior Geschrieben 9. August 2005 Autor Teilen Geschrieben 9. August 2005 inwiefern unsicher?!? kann ich damit auch das Dateiformat prüfen??? ...2 ein Flag je nach Grafik-Typ (1 = GIF, 2 = JPG, 3 = PNG, SWF = 4)... also sollte ja was anderes rauskommen wenn jemand ne textdatei hochläd!!! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Aiun Geschrieben 9. August 2005 Teilen Geschrieben 9. August 2005 mach mal ein print_r($_FILES); und arbeite dann damit. Da kannst du schonmal eine ganze Menge herausbekommen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 9. August 2005 Teilen Geschrieben 9. August 2005 Nur leider funzt das nicht, ich kann alles hochladen und es kommt immer als jpg auf dem Server an und ich habe keine Ahnung, wie ich die Dateigröße sowie die Abmessungen prüfen kann. Schau mal hier: http://de2.php.net/manual/de/features.file-upload.php $_FILES['userfile']['type'] Der Mime-Type der Datei, falls der Browser diese Information zur Verfügung gestellt hat. Ein Beispiel wäre "image/gif". $_FILES['userfile']['size'] Die Größe der hochgeladenen Datei in Bytes. Ausserdem bekommst du die Abmessungen mit getimagesize, wie schonmal geschrieben. Wenn es sich um eine Testdatei handelt, wird wohl keiner der von dir zitierten Werte zurückkommen, also ist deine Frage ja beantwortet Ausserdem kannst du das davor auch schon prüfen s.o. Oder du gehst nach dem Namen und suchst da, ob eine gewünschte Endung vorhanden ist. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ascom Geschrieben 9. August 2005 Teilen Geschrieben 9. August 2005 inwiefern unsicher?!? kann ich damit auch das Dateiformat prüfen??? ...2 ein Flag je nach Grafik-Typ (1 = GIF, 2 = JPG, 3 = PNG, SWF = 4)... also sollte ja was anderes rauskommen wenn jemand ne textdatei hochläd!!! da kann bei dir jeder ein Rootkit uploaden oder einen Trojener im Bild und danach an diesen Trojaner man-traffic laufen lassen Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Weekend_Warrior Geschrieben 9. August 2005 Autor Teilen Geschrieben 9. August 2005 da kann bei dir jeder ein Rootkit uploaden oder einen Trojener im Bild und danach an diesen Trojaner man-traffic laufen lassen Und wie mach ich das ander?? hab ich jetzt gerade mal keine Idee, wäre schon froh wenn der endelich die dateiformate prüft!! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Aiun Geschrieben 9. August 2005 Teilen Geschrieben 9. August 2005 Ascom, erkläre mir bitte mal wie das gehen soll ? ^^, ich bin rumgehacke nicht so drin. Bild ist bild. Wenn da .jpg dransteht wird es von jedem Client als bild abgerufen. Was interessiert das den Server ob da was drinist ? Und vor allem, wie will man das verhindern, das bild jetzt erst Pixel für Pixel demontieren und prüfen ? ^^ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 9. August 2005 Teilen Geschrieben 9. August 2005 da kann bei dir jeder ein Rootkit uploaden oder einen Trojener im Bild und danach an diesen Trojaner man-traffic laufen lassen Ja, jeder kann ein Rotkit hochladen, aber das wird dann vom php nicht als Bild erkannt und gelöscht. Und ein Trojaner im Bild ist dennoch erstmal ein Bild, oder hast du ein PHP-AntiVirus-Skript, mit dem du das überprüfst? Wie oben verlinkt, benutzt du am besten die PHP-Funktion move_uploaded_file. Damit wird sichergestellt, dass es sich um eine Datei handelt, die per HTTP-Post hochgeladen wurde (und nicht ein Verweiss auf /etc/passwd o.ä.). Dann prüfst du den Dateityp. Entweder über $_FILES und/oder über getimagesize, oder du prüfst $_FILES["filename"] selbst. Die Größe prüfst du auch über getimagesize und entweder verkleinerst du das bild dann mittels gd, oder lehnst es ab. Die gespeicherte Datei bindest du dann als <img... ein. Ich sehe da dann keine Sicherheitslücke, ausser evtl. einen "Trojaner im Bild". Dies ist aber ein u.a Fehler in der Bildbehandlung z.B. des IE und wird in anderen Browsern als "Bild kann nicht angezeigt werden, da es Fehler enthält" dargestellt. Und 1. dazu gibt es schon einen Patch, und 2. kann er das mit PHP nicht prüfen (bzw. sehr umständlich und auch nicht 100% genau). Genauso kann ja jeder ein Bild sonstwo hochladen und verlinken (oder u.U. als einbinden), was diesen "Fehler" enthält. EDIT: Bild ist bild. Wenn da .jpg dransteht wird es von jedem Client als bild abgerufen. Stimmt nicht ganz. Der Client erkennt es als Bild, wenn der Servern es als ContentType Image kennzeichnet. EDIT2: Beispiel von php.net: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Aiun Geschrieben 9. August 2005 Teilen Geschrieben 9. August 2005 thx jester ich hab' auch dynamische bilder auf meiner Seite, aber wie du sagtest, bei .jpg z.b. macht es der Server automatisch. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Weekend_Warrior Geschrieben 10. August 2005 Autor Teilen Geschrieben 10. August 2005 OK, habs jetzt so gemacht und es funzt besten Dank!!! PHP Script //UpLoader Anfang if(isset($_POST["Abschicken"])) { $fehler_pic= ''; $file_info= GetImageSize($file); if($file_info[2] == 2) //JPG { if($file_info[0] == 150 && $file_info[1] == 150) { if(filesize($file) <= 15000) { $updir = $DOCUMENT_ROOT.'/www/pics/pics'; $file_name=$U_ID.'.jpg'; move_uploaded_file($file, "$updir/$file_name"); } else { $fehler_pic= 'Das Bild ist größer als 10KB'; } } else { $fehler_pic= 'Falsche Bildabmessungen!!'; } } else { $fehler_pic= 'Falsches Dateiformat!!'; } } clearstatcache(); //UpLoader Ende[/PHP] Dateiauswahl [PHP]<form name="file" action="profil.php" enctype="multipart/form-data" method="POST"> Neues Bild hochladen:<br> (Abmesungen: 150x150 / Dateigröße: 10KB / Dateiformat: JPG)<br> <input name="file" type="file" size="30" maxlength="1024" accept="image/jpg"><br> <input type="submit" name="Abschicken" value="UpLoad" class="button"> </form> Und was war das jetzt noch mit den Scherheitslücken??? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Aiun Geschrieben 10. August 2005 Teilen Geschrieben 10. August 2005 du solltest dich dringend mal mit den Vorgebenen Arrays und Variablen beschäftigen. einfach nur $file zu benutzen ist mehr als unsicher. $DOKUMENT_ROOT dürfte auch depricated sein. da gibts so dinger wie $_POST, $_GET, $_COOKIE, $_FILES, $_SERVER ich glaube document root ist in Server drin und dein file ist $_FILES['file'] ansonsten könnte ich dein File auch mit einer get-Variablen ansteuern. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Weekend_Warrior Geschrieben 10. August 2005 Autor Teilen Geschrieben 10. August 2005 ok, habs mir mal durchgelesen, nur leider funzt es nicht... benutze jetzt $HTTP_SERVER_VARS["DOCUMENT_ROOT"] und $HTTP_POST_FILES["UpPic"] aber irgendwie ist das $HTTP_POST_FILES Array leer!! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Aiun Geschrieben 10. August 2005 Teilen Geschrieben 10. August 2005 ^^ $HTTP_ ... sind veraltet. mit $file solltest du nicht arbeiten weil das nur geht wenn "register_global" aktiviert ist, und selbst dann bäh ist ich glaube zwischen php3 und php4 wurde dann auf $_SERVER unsw. umgestellt. am besten mach mal print_r(...arrayname); mit den dingern die ich dir zuvor geschrieben habe. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Weekend_Warrior Geschrieben 10. August 2005 Autor Teilen Geschrieben 10. August 2005 OK, so funzt es!! $_FILES['UpPic']['tmp_name']; -> gibt den Namen der femporären Datei auf dem Server zurück. $file_info= GetImageSize($LoadedPic); -> ermittelt die Dateiinformationen. if($file_info[2] == 2) -> Überprüftob JPG $file_info[0] == 150 && $file_info[1] == 150) -> Überprüft die Bildabessungen if(filesize($LoadedPic <= 15000) -> Überprüft die Dateigröße Besten Danke Hamer wieder was gelernt!! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mascha Geschrieben 10. August 2005 Teilen Geschrieben 10. August 2005 Hast du mal ausprobiert, was passiert, wenn du eine Textdatei text.txt umbenennst in text.jpg und dann versuchst, sie hochzuladen? Ich meine mich zu erinnern, daß ich dann gewisse Probleme bekam, weil der in getimagesize() ausgelesene MIME-Type sich an der Dateiendung, nicht aber am tatsächlichen Inhalt orientierte. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mascha Geschrieben 10. August 2005 Teilen Geschrieben 10. August 2005 Ich glaube allerdings, ich hatte damals nur so überprüft: if (isset(GetImageSize($file)))... Tja, und da gab es keine Fehlermeldung. Reproduzieren kann ich das allerdings nicht mehr, da ich dann letztendlich eine andere Lösung wählte. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 10. August 2005 Teilen Geschrieben 10. August 2005 Hast du mal ausprobiert, was passiert, wenn du eine Textdatei text.txt umbenennst in text.jpg und dann versuchst, sie hochzuladen? Ich denke, ich weiss was dann passiert: Es gibt ein Bild, was nicht angezeigt werden kann. Willst du die Bilder auch noch auf einen evtl. Typheader untersuchen? JPEG Dateien nach dem JFIF Standard beginnen typischerweise mit 0xFFD8 und enthalten ab dem siebten Byte die Zeichenfolge JFIF. Für GIF und PNG bitte hier hinzufügen. Selbst wenn es eine umbenannte Textdatei ist, entsteht dadurch kein Schaden oder der User kann Code ausführen o.ä. Alles was der User damit bewirkt, ist ein verkrüppeltes Bild. EDIT: Durch die Prüfung der Bildgröße wird es, denke ich, sogar eher noch abgelehnt werden. Da bei der Prüfung wohl, schätze ich mal, ein Wert von 0 zurückgeliefert wird und er auf Gleichheit überprüft. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.