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! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
  #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.722
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.722
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: 25.236
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.722
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: 25.236
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.782
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: 851
fireweasel wird schon bald berühmt werdenfireweasel 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.

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

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

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