- Ad -
php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here!

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 23-06-2009, 17:25
Maanee9
 Registrierter Benutzer
Links : Onlinestatus : Maanee9 ist offline
Registriert seit: Jun 2009
Beiträge: 29
Maanee9 befindet sich auf einem aufstrebenden Ast
Standard Fragen zu Dateiupload / Dateitypen

Hallo PHPler,

ich habe mir heute ein kleines Dateiuploadscript geschrieben und hab dazu ein paar Fragen.

- 1. Wie kann ich festlegen das nur nur bestimmte Dateitypen bzw Dateien mit speziellen Endungen (z.B. .jpg .png) gespeichert werden.
- 2. Wie löse ich das Problem mit gleichen Dateinamen? (neuere Dateien überschreiben Alte mit dem selben Namen)

Vielen dank schon mal für eure Antworten

PHP-Code:
<?php

// Prüfen des Arrays $_FILES;

if (isset($_FILES["datei"]))
   {
   
//Upload-Status
   
if ($_FILES["datei"]["error"] == UPLOAD_ERR_OK)
         {
         
//Muster zur Überprüfung der im Dateinnamen enthaltenen Zeichen (Optional)
         
$regEXP "/^[a-z_]([a-z0-9_-]*\.?[a-z0-9_-])*\.[a-z]{3,4}$/i";
         
         
//Überprüfen von Dateinname und Dateigröße
         
if (preg_match($regEXP$_FILES["datei"]["name"]) && $_FILES["datei"]["size"] > && $_FILES["datei"]["size"] < 10000000)
              {
              
//Temporäre Datei in das Zielverzeichnis des Servers verschieben
              
move_uploaded_file($_FILES["datei"]["tmp_name"], "user_files/" .$_FILES["datei"]["name"]);
               
               
//Namen speichern für spätere Übergabe für Bildausgabe
               
$dname $_FILES["datei"]["name"];
               
               
//zusätzliche Infos in Arraysaufteilen
               
$dtype $_FILES["datei"]["type"];
               
$dsize $_FILES["datei"]["size"];
               
               
               
//Redirect zur Erfolgsmeldung + Dateinamenübergabe via Get
               
header("Location: datei_upload_status.php?dateiname=user_files/$dname&dtype=$dtype&dsize=$dsize Byte");              
              }
      else
            {
            echo 
"<h1><center>Fehler im Dateinamen oder in der Dateigröße -> Limit: <u>10000 kb</u> !</center>";
            }
      
         }
       else 
            {
            echo 
"<h1><center>Fehler bei der Übertragung !</center>";
            }       
   }
else
    {
    echo 
"<h1><center>Dateiupload Fehlgeschlagen</center>";
    }


?>
__________________
Der die das, wer wie was, wieso weshalb warum
..... wer nicht fragt bleibt dumm.
Mit Zitat antworten
  #2 (permalink)  
Alt 23-06-2009, 17:54
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.308
Kropff befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
1. Wie kann ich festlegen das nur nur bestimmte Dateitypen bzw Dateien mit speziellen Endungen (z.B. .jpg .png) gespeichert werden.
per substr und bei bildern zusätzlich mit getimagesize
Zitat:
2. Wie löse ich das Problem mit gleichen Dateinamen? (neuere Dateien überschreiben Alte mit dem selben Namen)
per file_exists prüfen und ggf. alte datei mit unlink löschen.

peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
Mit Zitat antworten
  #3 (permalink)  
Alt 23-06-2009, 18:08
Maanee9
 Registrierter Benutzer
Links : Onlinestatus : Maanee9 ist offline
Registriert seit: Jun 2009
Beiträge: 29
Maanee9 befindet sich auf einem aufstrebenden Ast
Standard

Zu 1:
Zitat:
per substr und bei bildern zusätzlich mit getimagesize
Vielen Dank. Das is die Lösung die ich gesucht habe.

Zu 2:
Zitat:
per file_exists prüfen und ggf. alte datei mit unlink löschen.
Ist zwar nicht ganz genau das was ich wollte hat mich aber auf die Idee gebracht vor dem Dateinamen einfach nen Unixzeitstempel vorne dranzuhängen.

Also auch hier noch mal thx.
__________________
Der die das, wer wie was, wieso weshalb warum
..... wer nicht fragt bleibt dumm.
Mit Zitat antworten
  #4 (permalink)  
Alt 23-06-2009, 18:53
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.308
Kropff befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Vielen Dank. Das is die Lösung die ich gesucht habe.
Aber das getimagesize nicht vergessen, sonst kann man dir Schadcode unterjubeln!
Zitat:
Ist zwar nicht ganz genau das was ich wollte hat mich aber auf die Idee gebracht vor dem Dateinamen einfach nen Unixzeitstempel vorne dranzuhängen.
Auch 'ne Möglichkeit.

Peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
Mit Zitat antworten
  #5 (permalink)  
Alt 23-06-2009, 19:33
Maanee9
 Registrierter Benutzer
Links : Onlinestatus : Maanee9 ist offline
Registriert seit: Jun 2009
Beiträge: 29
Maanee9 befindet sich auf einem aufstrebenden Ast
Standard

Hab meinen Code jetzt geändert mit "Getimagesize, time(), sowie substr()".

Allerdings hab ich jetzt eine Frage bezüglich der Dateienden Überprüfung.
Ich habe jetzt alle meinen zulässigen Dateitypendungen in ein Array gepackt.
Wie kann ich jetzt die Werte im Array am besten mit dem Dateinamen vergleichen ohne das ich jedes Arrayelement mit einem extra
"&& $dendung == $dendung_pruef[0] || $dendung == $dendung_pruef[1] etc..."
einzeln abprüfe.

PS: Das PHP-Handbuch funktioniert grad irgendwie nicht mehr.

Hier jedenfalls der neue Codeteil:

PHP-Code:
         //Dateiendungen sowie Imagesize() überprüfen
         
$dendung substr($_FILES["datei"]["name"],-4);
         
$dendung_pruef = array(".jpg"".gif""jpeg"".png");
         
$dbildinfo getimagesize ($_FILES["datei"]["tmp_name"]);
         
         
//Überprüfen von Dateinname und Dateigröße
         
if (preg_match($regEXP$_FILES["datei"]["name"]) && $_FILES["datei"]["size"] > && $_FILES["datei"]["size"] < 10000000 && $dbildinfo && $dendung == "!!!Hier sollten die Endungen geprüft werden!!!")
              {
              
               
//vor den Dateinamen Unixzeitstempel hinzufügen für zuspeichernden Dateinamen.
                             
               
$dname time() ." " .$_FILES["datei"]["name"];
               
               
              
//Temporäre Datei in das Zielverzeichnis des Servers verschieben
              
move_uploaded_file($_FILES["datei"]["tmp_name"], "user_files/" .$dname); 
__________________
Der die das, wer wie was, wieso weshalb warum
..... wer nicht fragt bleibt dumm.
Mit Zitat antworten
  #6 (permalink)  
Alt 23-06-2009, 19:36
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 24.486
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Dateiendung isolieren, und dann in_array() verwenden.

Dass eine Datei, die vom Client kommt, jede beliebige Endung haben kann (oder auch gar keine), ist hoffentlich klar.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #7 (permalink)  
Alt 23-06-2009, 19:51
Maanee9
 Registrierter Benutzer
Links : Onlinestatus : Maanee9 ist offline
Registriert seit: Jun 2009
Beiträge: 29
Maanee9 befindet sich auf einem aufstrebenden Ast
Standard

Stimmt... in_array.. hätt ich auch drauf kommen können.

Das ich Dateien jegmögliche Dateiendung geben kann obwohls ne andere Datei ist ist mir klar.

Obs wirklich ein Bild ist überprüft ja im Prinzip ja sowieso Imagesize().

Das mit den Dateiendungen soll eigentlich nur deswegen sein weil diese Dateitypen in meinem Fall wünschenswert sind, aber nicht zwingend erforderlich. (wenn dann später was nicht richtig funktioniert weils der falsche Bilddateityp ist, solls das Problem der Benutzer sein. nicht meins )

Damit sind meine Fragen auch schon wieder alle beantwortet für heute.

Nochmals vielen Dank.

__________________
Der die das, wer wie was, wieso weshalb warum
..... wer nicht fragt bleibt dumm.
Mit Zitat antworten
  #8 (permalink)  
Alt 23-06-2009, 20:07
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.308
Kropff befindet sich auf einem aufstrebenden Ast
Standard

schau dir auf jeden fall mal dieses tutorial an. besonders die abschnitte datei-uploads. das ist zwar noch nicht alles, aber du hast die prinzipien von diversen attacken gelernt. auch wenn es da noch andere möglichkeiten (auch bei bildern) gibt.

peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
Mit Zitat antworten
  #9 (permalink)  
Alt 24-06-2009, 12:59
Maanee9
 Registrierter Benutzer
Links : Onlinestatus : Maanee9 ist offline
Registriert seit: Jun 2009
Beiträge: 29
Maanee9 befindet sich auf einem aufstrebenden Ast
Standard

Hab mir das Tutorial mal angesehen und festgestellt, dass das eigentlich kein Problem sein sollte, da ich in keiner anderen Seite mit get arbeite und im Regelfall alle Übertragungen bei mir mit Rijaendel verschlüsselt werden.

Jetzt noch zur Ausgabe selber:
Ich geb nach erfolggreichem Upload und Speicherung der Datei noch die URL und das Bild selber aus mit htmlcode.
Giebts da auch noch ne Möglichkeit das dadurch Unfug entsteht ?


<p><font face="arial, helvetica, sans-serif" size="5"><a href="domain/TEST/<?php echo $dname; ?>">domain/TEST/<?php echo $dname; ?></a></font>

<p><img src="<?php echo $dname;?>" ></p>
__________________
Der die das, wer wie was, wieso weshalb warum
..... wer nicht fragt bleibt dumm.
Mit Zitat antworten
  #10 (permalink)  
Alt 24-06-2009, 15:12
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 24.486
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Maanee9 Beitrag anzeigen
Ich geb nach erfolggreichem Upload und Speicherung der Datei noch die URL und das Bild selber aus mit htmlcode.
Giebts da auch noch ne Möglichkeit das dadurch Unfug entsteht ?
Natürlich, schliesslich hast du den vom Client übergebenen Dateinamen übernommen.
Ob das schon beim Verschieben der hochgeladenen Datei gefährlich werden kann, weiss ich gerade nicht - k.A., ob PHP da wenigstens sowas wie ../ schon rausfiltern würde.
Bei der Ausgabe als URL-Bestandteil dann auf jeden Fall - da muss noch eine kontextgerechte Kodierung mit rein.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #11 (permalink)  
Alt 24-06-2009, 16:26
Maanee9
 Registrierter Benutzer
Links : Onlinestatus : Maanee9 ist offline
Registriert seit: Jun 2009
Beiträge: 29
Maanee9 befindet sich auf einem aufstrebenden Ast
Standard

Ok.. das mir evtl sogar der Dateiname schon Probleme machen könnte hab ich nicht gewusst.

Hab das jetzt mal so gelöst mit dem Dateinamen:
(Damit sollte eigentlich alles aus Dateinamen draußen sein was nicht rein soll oder ?)



PHP-Code:
               //Html- und PHP-Code entfernen
               
$dname strip_tags($dname);
               
//Umlaute und Sonderzeichen in HTML-Schreibeweise umwandeln
               
$dname htmlentities($dname);
               
//Leerzeichen am Ende und Anfang Entfernen
               
$dname trim($dname);
               
//Backslashes entfernen
               
$dname stripslashes($dname); 
__________________
Der die das, wer wie was, wieso weshalb warum
..... wer nicht fragt bleibt dumm.
Mit Zitat antworten
  #12 (permalink)  
Alt 24-06-2009, 17:19
unset
  Moderator
Links : Onlinestatus : unset ist offline
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.778
unset befindet sich auf einem aufstrebenden Ast
Standard

Du versucht zu ermitteln, was böse ist und das zu entfernen (Blacklisting). In solch einem Fall solltest du aber sagen, was ok ist, und nichts anderes gestatten (Whitelisting). Ein Pattern, das nur Zahlen, Buchstaben, Punkte und Bindestriche zulässt wäre zum Beispiel ein Anfang. Der Rest wird einfach weggeschmissen.
Mit Zitat antworten
  #13 (permalink)  
Alt 24-06-2009, 17:51
Maanee9
 Registrierter Benutzer
Links : Onlinestatus : Maanee9 ist offline
Registriert seit: Jun 2009
Beiträge: 29
Maanee9 befindet sich auf einem aufstrebenden Ast
Standard

Ok. Dann mach ich das auf die Whitlisting Art.

Damit sollte dann eigenlich eine Relativ gute Prävention da sein damit ich mich wieder anderen Sachen widmen kann.

__________________
Der die das, wer wie was, wieso weshalb warum
..... wer nicht fragt bleibt dumm.
Mit Zitat antworten
  #14 (permalink)  
Alt 24-06-2009, 22:44
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
fireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von Maanee9 Beitrag anzeigen
Ok.. das mir evtl sogar der Dateiname schon Probleme machen könnte hab ich nicht gewusst.

Hab das jetzt mal so gelöst mit dem Dateinamen:
(Damit sollte eigentlich alles aus Dateinamen draußen sein was nicht rein soll oder ?)
...
Schau dir mal basename() an, wenn das PHP-Handbuch wieder funktioniert.

Ein passender regulärer Ausdruck tuts aber auch, eigentlich noch etwas besser als basename():
PHP-Code:
// returns an empty string '' for invalid paths
$basename preg_replace('/\A.*?(?!\.+)([^\/\x5c]*)\z/s''$1'$path); 
HTML-Encoding sollte man nur anwenden, wenn der String auch im HTML-Kontext ausgegeben werden soll. Da Dateinamen auch Leerzeichen enthalten dürfen (unter Windoze bspw. seit VFAT16 so ca. seit 1996, andere Betriebs-/Filesysteme können das schon seit den frühen 1980-ern), würde ich auf trim() verzichten. Aber das ist Ansichtssache.

Für stripslashes() kenne ich nur eine vernünftige Anwendung: In die Tonne treten. Das Gleiche gilt für strip_tags(). PHP bietet eine Menge an unsinnigen Funktionen an, aber nur weil sie da sind, muss man sie nicht in eigene Scripts einbauen.
__________________
PHP-Code:
class Brick implements Throwable {
    
// ... 


Geändert von fireweasel (24-06-2009 um 22:53 Uhr)
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[PHP5] Kann Smarty Dateitypen erkennen? Screw Driver PHP Developer Forum 3 11-06-2007 01:33
Verzeichnis auslesen nur bestimmte dateitypen schokocappu PHP Developer Forum 11 03-08-2006 22:16
Dateitypen speicherung ?? firstlord18 Windows (Client/Server) 1 19-12-2004 18:27
dateitypen? BloodReaver Linux und Unix 2 26-11-2003 13:50
Dateitypen! okoman PHP Developer Forum 3 23-10-2002 19:37

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

MariaDB 5.5 veröffentlicht
MariaDB 5.5 veröffentlichtDie freie MySQL-Alternative MariaDB wurde in der stabilen Version 5.5.23 veröffentlicht und soll einige Verbesserungen gegenüber Oracles Communityversion von MySQL mitbringen.

16.04.2012 | Berni

Deutsche Yii Framework Community
Deutsche Yii Framework CommunitySeit dem 19.03.2012 gibt es für die Yii PHP Framework Community ein deutsches Zuhause.

20.03.2012 | dhcomputer

 

Aktuelle PHP Scripte

EM 2012 Tipp-Spiel ansehen EM 2012 Tipp-Spiel

Online Tipp-Spiel zur Fussball Europameisterschaft 2012, basierend auf php-Script mit hinterlegter mySql-Datenbank

27.05.2012 tippimnetz | Kategorie: PHP/ Spiele
Advanced Login ansehen Advanced Login

Login-System und Kundenverwaltung, die sich spielend leicht in bestehende Webseiten einbauen lässt und einen enormen Funktionsumfang bietet. Ihre eigene Webseite muss mit Advanced Login nicht umständlich an ein fertiges System angepasst werden.

25.05.2012 Madden | Kategorie: PHP/ Kundenverwaltung
BROM CMS/BelCal 3 ansehen BROM CMS/BelCal 3

Spezielles CMS für Betreiber von Ferienwohnungen. Komplette Seitenerstellung online, Verwaltung mehrerer Objekte, Reservierungssystem mit sofortigem Abgleich im Belegungskalender und vieles mehr bietet dieses Content Management System.

25.05.2012 belcal2 | Kategorie: PHP/ CMS
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 11:54 Uhr.