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

23-06-2009, 17:25
|
|
Maanee9
Registrierter Benutzer
|
|
Registriert seit: Jun 2009
Beiträge: 29
|
|
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"] > 0 && $_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.
|

23-06-2009, 17:54
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.308
|
|
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
|

23-06-2009, 18:08
|
|
Maanee9
Registrierter Benutzer
|
|
Registriert seit: Jun 2009
Beiträge: 29
|
|
Zu 1:
Vielen Dank. Das is die Lösung die ich gesucht habe.
Zu 2:
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.
|

23-06-2009, 18:53
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.308
|
|
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
|

23-06-2009, 19:33
|
|
Maanee9
Registrierter Benutzer
|
|
Registriert seit: Jun 2009
Beiträge: 29
|
|
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"] > 0 && $_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.
|

23-06-2009, 19:36
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
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.
|

23-06-2009, 19:51
|
|
Maanee9
Registrierter Benutzer
|
|
Registriert seit: Jun 2009
Beiträge: 29
|
|
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.
|

23-06-2009, 20:07
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.308
|
|
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
|

24-06-2009, 12:59
|
|
Maanee9
Registrierter Benutzer
|
|
Registriert seit: Jun 2009
Beiträge: 29
|
|
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.
|

24-06-2009, 15:12
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von Maanee9
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.
|

24-06-2009, 16:26
|
|
Maanee9
Registrierter Benutzer
|
|
Registriert seit: Jun 2009
Beiträge: 29
|
|
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.
|

24-06-2009, 17:19
|
unset
 Moderator
|
|
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.778
|
|
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.
|

24-06-2009, 17:51
|
|
Maanee9
Registrierter Benutzer
|
|
Registriert seit: Jun 2009
Beiträge: 29
|
|
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.
|

24-06-2009, 22:44
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
Zitat:
Zitat von Maanee9
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)
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| 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.
HTML-Code ist aus.
|
|
|
|
PHP News
|