Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Dateiupload

Empfohlene Antworten

Veröffentlicht

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.

u.a. mit getimagesize.

dein script (zumindest der ausschnitt, den ich sehe) ist im übrigen extremst unsicher gegen angriffe.

s'Amstel

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!!!

mach mal ein print_r($_FILES);

und arbeite dann damit. Da kannst du schonmal eine ganze Menge herausbekommen.

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.

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

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!!

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 ? ^^

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 %7Boption%7D 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:

thx jester :)

ich hab' auch dynamische bilder auf meiner Seite, aber wie du sagtest, bei .jpg z.b. macht es der Server automatisch.

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???

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.

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!!

^^

$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.

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!!

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.

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.

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.