PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP für Fortgeschrittene und Experten (http://www.selfphp.de/forum/forumdisplay.php?f=13)
-   -   Uploadscript für Bilder (http://www.selfphp.de/forum/showthread.php?t=25465)

Heinrich 30.12.2014 20:08:55

Uploadscript für Bilder
 
Hallo,

hatte ja Probleme mit den Filemanagern der Webeditoren. Und nun auch festgestellt, dass mein bisheriges Uploadscript locker manipulierte Dateien bzw. Dateiendungen durchlässt.

Nun habe ich ein neues erstellt und möchte euch fragen, ob ihr das für sicher haltet. (Es liegt zwar im passwortgeschützten Bereich, aber das waren die anderen angreibaren auch.)

Schon mal danke für Kritik und Hinweise!

PHP-Code:

<h3>Bilder für Webseite hochladen</h3>
<?php
// Hier wird das Fomular (siehe ganz unten) verarbeitet
if ($_POST['los']) {

$uploaddir _BILDPFAD_ABS;
$uploaddatei basename($_FILES['userfile']['name']);
$uploadfile $uploaddir $uploaddatei;
$dateiendung stristr $uploaddatei'.' );


echo 
"Uploaddatei: ".$uploaddatei."<br />";
echo 
"Uploadfile: ".$uploadfile."<br />";
echo 
"Dateiendung: ".$dateiendung."<br />";
echo 
"Größe: ".$_FILES['userfile']['size']."<br />";
echo 
"MIMETYPE: ".$_FILES['userfile']['type']."<br />";
echo 
"<hr />";

if (
exif_imagetype($_FILES['userfile']['tmp_name']) == false) {
    echo 
"kein Bild!!!!!<br />";
    exit;
    }
if (
substr_count $dateiendung'.' ) > 1) {
    echo 
"Wahrscheinlich doppelte Dateiendung<br />";
    exit;
    }
else {
if (
move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo 
"Datei ist valide und wurde erfolgreich hochgeladen.\n";
    }
    else {
    echo 
"Möglicherweise eine Dateiupload-Attacke!\n";
    }
}

        echo 
"<table border='1' width='80%'><tr><td>";
//        $_SESSION['bilddatei'] = $uploaddatei;
        
echo "<h3>Ergebnis Bild hochladen:</h3>";    
        echo 
"<b>Gerade hoch geladenes Bild</b> ";
        echo 
$uploaddatei."<br/>";
        echo 
"<img src='"._BILDPFAD.$uploaddatei."'><br />";
        echo 
"</td></tr></table>";


// Ende if ($_POST['los']) {
?>

HTML-Code:

<!-- Die Encoding-Art enctyoe MUSS wie dargestellt angegeben werden -->
<form enctype="multipart/form-data" action="<?php $_SERVER['PHP_SELF'] ?>" method="POST">
    <!-- MAX_FILE_SIZE muss vor dem Dateiupload Input Feld stehen -->
    <input type="hidden" name="MAX_FILE_SIZE" value="500000" />
    <!-- Der Name des Input Felds bestimmt den Namen im $_FILES Array -->
    Diese Datei hochladen:<br /> <input name="userfile" type="file" /><br />
  <p>  <input type="submit" name="los" value="Hochladen" /></p>
</form>


BozzaCoon 06.01.2015 11:13:49

AW: Uploadscript für Bilder
 
Hallo Heinrich,
habe mir das Script mal geschnappt und damit rumprobiert.
Ich schildere dir hier meine Eindrücke:
- 0,477 MByte Bilder? zu klein für heutige Fotos zu groß für Avatare. Bin mir unsicher warum du die Größe gewählt hast.
- man kann mit leichtigkeit das Value im Editormodus jedes Explorers ändern / oder sogar anzeigen lassen und ändern (hidden --> text)

Sind keine schwerwiegenden Fehler nur hab ich dies festgestellt und mit dem Forum hier vergliechen...
Wenn ich hier im Forum Bilder hochlade die zu groß sind werden sie automatisch auf die passende größe gebracht
und ich erhalte keine fehlermeldung. Das passiert wohl nicht Clientseitig(wenn doch hab ich es nicht gesehen).
Wie man dies erreicht da habe ich leider keine Vorschläge.

Für mich als Anfänger sieht der Script aber soweit gut aus.
Lg BozzaCoon

DokuLeseHemmung 06.01.2015 11:42:28

AW: Uploadscript für Bilder
 
Zitat:

action="<?php $_SERVER['PHP_SELF'] ?>"
Zum Glück hast du hier das echo vergessen, denn sonst würde es vermutlich XSS Attacken erlauben.

Heinrich 06.01.2015 12:21:31

AW: Uploadscript für Bilder
 
@BozzaCoon

Danke für den Tipp. Die Form habe ich wohl schludrig aus dem Netz kopiert. Max_file_size wird von meinem Script überhaupt nicht verarbeitet. Das sollte ich dort noch selbst definieren (aus der Form kann das weg).

Die ganze Anwendung läuft sowieso nur im geschützten Redaktionsbereich eines CMS, also kein für jeden zugänglicher Upload.

@DokuLeseHemmung

Danke - ich habe erst vor kurzem gelesen, dass $_SERVER['PHP_SELF'] problematisch sei. Ist es das nur mit "echo" oder auch so, wie es bei mir steht? Oder sollte ich den konkreten Namen der aufzurufenden Datei nehmen.

Was sagst du zu der Prüfung des Uploads?

DokuLeseHemmung 06.01.2015 12:49:31

AW: Uploadscript für Bilder
 
Zitat:

Ist es das nur mit "echo" oder auch so, wie es bei mir steht?
So wie es bei dir steht, ist es komplett sinnfrei.

Zitat:

Was sagst du zu der Prüfung des Uploads?
Naja, ob du wirklich alle möglichen Image Typen unterstützen willst, kannst nur du wissen....

Heinrich 06.01.2015 13:08:11

AW: Uploadscript für Bilder
 
<?php $_SERVER['PHP_SELF'] ?> mag sinnfrei sein... jedenfalls funktioniert es...Dürfte es das nicht?

Mit den Mime-Typen hast du recht. Könnte ich noch auf jpg, gif und png eingrenzen.

Ckaos 06.01.2015 13:55:38

AW: Uploadscript für Bilder
 
Hi,

was Doku meint ist: PHP_SELF ist immer Mist!
Was du da machst ist nichts denn ohne echo kannst du den Part auch löschen und solltest es auch, denn dein "action" ist LEER und nimmt dadurch die aufgerufene URL als Ziel.
Überprüfe deinen Quelltext!

Dein Uploadscript ist noch sehr ausbaufähig.
Ich würde nie den Namen der Datei übernehmen!
Bsp.: Gerade bei Digitalkameras gibt es IMG_XXX.jpg 1000mal und die überschreiben sich
dann?

Benutze eine Datenbank oder Textfile für die Orginalname / timestamp.

MfG

CKaos

DokuLeseHemmung 06.01.2015 14:21:37

AW: Uploadscript für Bilder
 
Zitat:

Zitat von Heinrich (Beitrag 147362)
<?php $_SERVER['PHP_SELF'] ?> mag sinnfrei sein... jedenfalls funktioniert es...Dürfte es das nicht?

Ohne echo tut es nichts. Also sinnfrei.
Mit echo ist es eine Gefahr.

HTML vor 5 erwartet zwingend das action Attribut.
Es darf leer sein. Dann füllt der Browser es, wie er es für richtig erachtet.

In HTML5 darf das action Attribut fehlen, wenn es aber vorhanden ist, dann muss es auch (sinnvoll) gefüllt sein.

Zu: $_SERVER['PHP_SELF']
Meist ist $_SERVER['SCRIPT_NAME'] angemessener.
Aber auf manchen Systemen ermöglicht auch dieses XSS Attacken.
Prüfe das vor der Verwendung.

Heinrich 06.01.2015 15:03:54

AW: Uploadscript für Bilder
 
Okay danke, das mit $_SERVER['PHP_SELF'] habe ich verstanden. Werde zukünftig $_SERVER['SCRIPT_NAME'] verwenden.

Wichtiger ist aber ja, dass ich das, was darüber (evt. manipuliert) reinkommt, kontrolliere. Mache ich bei Zahlen-Parametern mit
PHP-Code:

$id intval($_GET['id']); 

Bei sonstigem string mit Prüfung durch eine Whitelist bzw.
PHP-Code:

$string strip_tags($_GET['string']); 

Meint ihr, das ist sicher?

@Ckaos
Der Bildupload ist nur im geschützten CMS-Bereich; da habe ich die Übersicht über die Bildnamen. Aber du hast Recht - ich sollte das überschreiben noch ausschließen.


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:06:43 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.