Zum Inhalt springen

Dateiupload


Empfohlene Beiträge

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

^^

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...