Weekend_Warrior Geschrieben 9. August 2005 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.
Amstelchen Geschrieben 9. August 2005 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
Weekend_Warrior Geschrieben 9. August 2005 Autor 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!!!
Aiun Geschrieben 9. August 2005 Geschrieben 9. August 2005 mach mal ein print_r($_FILES); und arbeite dann damit. Da kannst du schonmal eine ganze Menge herausbekommen.
geloescht_JesterDay Geschrieben 9. August 2005 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.
ascom Geschrieben 9. August 2005 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
Weekend_Warrior Geschrieben 9. August 2005 Autor 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!!
Aiun Geschrieben 9. August 2005 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 ? ^^
geloescht_JesterDay Geschrieben 9. August 2005 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:
Aiun Geschrieben 9. August 2005 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.
Weekend_Warrior Geschrieben 10. August 2005 Autor 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???
Aiun Geschrieben 10. August 2005 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.
Weekend_Warrior Geschrieben 10. August 2005 Autor 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!!
Aiun Geschrieben 10. August 2005 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.
Weekend_Warrior Geschrieben 10. August 2005 Autor 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!!
Mascha Geschrieben 10. August 2005 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.
Mascha Geschrieben 10. August 2005 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.
geloescht_JesterDay Geschrieben 10. August 2005 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.
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden