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 (1) Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
  #16 (permalink)  
Alt 21-09-2006, 16:40
nichtsooft
 Registrierter Benutzer
Links : Onlinestatus : nichtsooft ist offline
Registriert seit: Apr 2006
Ort: Wien [AUT]
Beiträge: 385
nichtsooft ist zur Zeit noch ein unbeschriebenes Blatt
nichtsooft eine Nachricht über ICQ schicken
Standard

Edit:
Zitat:
Original geschrieben von kuddeldaddeldu
...Es kann doch nicht so schwer sein, aus einem Pfad den Dateinamen zu lesen...
Ist es auch nicht! -> basename(). Aber ich durchschau nicht was du mir damit sagen willst? Wenn ich nur den Dateinamen ohne Pfad angebe, wird selbst PHP die Datei nicht finden!


Zur Codierung/Decodierung:
Nun ja; ich hab an und für sich mit htmlentities() und html_entity_decode() rumexperimentiert um das ganze URLgerecht zu machen.

Zur Überprüfung ob ein Pfad erlaubt ist:
Es sind grundsätzlich alle Dateien erlaubt, die im Verzeichniss "pics/galerie" abgelegt sind. d.h. wenn ich diesen String vor jede emfangene URL hänge kann der User eigentlich bloss noch erlaubte Dateien erreichen.

Punch me if I'm wrong!

Geändert von nichtsooft (21-09-2006 um 16:45 Uhr)
Mit Zitat antworten
  #17 (permalink)  
Alt 21-09-2006, 16:43
TobiaZ
  Moderator
Links : Onlinestatus : TobiaZ ist offline
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
Blog-Einträge: 1
TobiaZ befindet sich auf einem aufstrebenden Ast
Standard

NEIN.

Ein einfaches ../ reicht, um eine ebene Höher zu kommen. Das "Startverzeichnis"-setzen ist also keine Wirksame absicherung.
__________________
ERST LESEN: Unsere Regeln. | Ich hab schon Pferde kotzen sehn!

READ THIS: Strings richtig trennen/verbinden | JOINs, das leidige Thema | Wegwerf E-Mail Adressen

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #18 (permalink)  
Alt 21-09-2006, 16:54
jahlives
 Master
Links : Onlinestatus : jahlives ist offline
Registriert seit: Jun 2004
Ort: Hooker in Kernel
Beiträge: 8.279
jahlives ist zur Zeit noch ein unbeschriebenes Blatt
Standard

@topicstarter
Dateiname:
PHP-Code:
echo basename('irgendEinLanger/und/komplizierter/pfad/index.html'); 
Zitat:
Nun ja; ich hab an und für sich mit htmlentities() und html_entity_decode() rumexperimentiert um das ganze URLgerecht zu machen.
Würde ich jetzt urldecode() und urlencode() dazu verwenden...
Zitat:
wenn ich diesen String vor jede emfangene URL hänge kann der User eigentlich bloss noch erlaubte Dateien erreichen.
PHP-Code:
if(file_exists($_SERVER['DOCUMENT_ROOT'].'/pics/gallery/'.basename($_GET['datei']))){
    
//Datei ist im erlaubten Verzeichnis
}else{
    die(
'Diese Datei darf nicht runtergeladen werden. Und Tschüss');

Dann darfst du als Datei aber nur noch den Namen übergeben und nicht mehr den gesamten Pfad.
basename($_GET['datei']) sollte imho dafür sorgen dass nur der Dateiname verwendet wird und allfällige Pfadanhängsel abgeschnitten werden.

Gruss

tobi
__________________
Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."
Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)
Mit Zitat antworten
  #19 (permalink)  
Alt 21-09-2006, 17:04
kuddeldaddeldu
 Registrierter Benutzer
Links : Onlinestatus : kuddeldaddeldu ist offline
Registriert seit: Sep 2006
Beiträge: 437
kuddeldaddeldu ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hi,

Zitat:
Aber ich durchschau nicht was du mir damit sagen willst? Wenn ich nur den Dateinamen ohne Pfad angebe, wird selbst PHP die Datei nicht finden!
Wenn ich Dich richtig verstanden habe, geht das Download-Fenster auf
und Du kannst die Datei abspeichern, blöd ist nur, dass er da so'n
komischen Namen vorschlägt?

Zitat:
Nun ja; ich hab an und für sich mit htmlentities() und html_entity_decode() rumexperimentiert um das ganze URLgerecht zu machen.
Dafür eignen sich eher URL-Funktionen.

Zitat:
Es sind grundsätzlich alle Dateien erlaubt, die im Verzeichniss "pics/galerie" abgelegt sind. d.h. wenn ich diesen String vor jede emfangene URL hänge kann der User eigentlich bloss noch erlaubte Dateien erreichen.
Wenn dieses Verzeichnis feststeht, warum übergibst Du dann
überhaupt Pfade? Dann übergib doch gleich nur die Namen und
bastel Dir für Dein readfile den Pfad davor. Hierbei trotzdem nicht
vergessen, den Namen zu überprüfen, s. Tobiaz!

Zitat:
Punch me if I'm wrong!
PATSCH!!!
Mit Zitat antworten
  #20 (permalink)  
Alt 21-09-2006, 17:05
nichtsooft
 Registrierter Benutzer
Links : Onlinestatus : nichtsooft ist offline
Registriert seit: Apr 2006
Ort: Wien [AUT]
Beiträge: 385
nichtsooft ist zur Zeit noch ein unbeschriebenes Blatt
nichtsooft eine Nachricht über ICQ schicken
Standard

@ jahlives

Von der Idee her garnicht schlecht!
PHP-Code:
if(file_exists($_SERVER['DOCUMENT_ROOT'].'/pics/gallery/'.basename($_GET['datei']))){
    
//Datei ist im erlaubten Verzeichnis
}else{
    die(
'Diese Datei darf nicht runtergeladen werden. Und Tschüss');

Aber was wenn die Datei in einem Subverzeichniss liegt? Bsp:
/pics/gallery/bla/bla/blub/bild.jpg
Mit Zitat antworten
  #21 (permalink)  
Alt 21-09-2006, 17:11
3DMax
 PHP Senior
Links : Onlinestatus : 3DMax ist offline
Registriert seit: Jan 2004
Beiträge: 1.916
3DMax ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von nichtsooft
Aber was wenn die Datei in einem Subverzeichniss liegt? Bsp:
/pics/gallery/bla/bla/blub/bild.jpg [/B]
dann kannst du ja mit realpath() den kompletten pfad bilden und dann überprüfen, ob er mit /pics/gallery beginnt.
Mit Zitat antworten
  #22 (permalink)  
Alt 22-09-2006, 11:36
nichtsooft
 Registrierter Benutzer
Links : Onlinestatus : nichtsooft ist offline
Registriert seit: Apr 2006
Ort: Wien [AUT]
Beiträge: 385
nichtsooft ist zur Zeit noch ein unbeschriebenes Blatt
nichtsooft eine Nachricht über ICQ schicken
Standard

NÖ Leute ich steig da absolut nicht durch! Sitze jetzt länger als nen Tag dahinter und schaff's nicht! Bin müde und geh jetzt schlafen!

Jmd ne idee ob man sowas als snippet irgendwo im web bekommt?
Mit Zitat antworten
  #23 (permalink)  
Alt 22-09-2006, 15:50
kuddeldaddeldu
 Registrierter Benutzer
Links : Onlinestatus : kuddeldaddeldu ist offline
Registriert seit: Sep 2006
Beiträge: 437
kuddeldaddeldu ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hi,
Zitat:
Jmd ne idee ob man sowas als snippet irgendwo im web bekommt?
Nö.

Das halte ich aber auch nicht für nötig. Du bist doch eigentlich fast am
Ziel. Wenn Du Hilfe willst, musst Du uns aber genau sagen, womit Du
nicht klarkommst. Hast Du ein Problem mit der Überprüfung des
Verzeichnisses? Wenn ja welches? Mach Testausgaben Deiner
Variablen.
Stört Dich der komische Dateiname? Setze in der entsprechenden
Header-Zeile (Content-Disposition...) filename auf den Dateinamen,
nicht auf den Pfad (ich fände es übrigens EAB, wenn mir als Download-
Name ein Pfad vorgeschlagen wird. Der wird auf meinem Rechner
selten existieren, und wenn, will ich das da aber vielleicht gar nicht rein haben).

Zitat:
NÖ Leute ich steig da absolut nicht durch! Sitze jetzt länger als nen Tag dahinter und schaff's nicht! Bin müde und geh jetzt schlafen!
Guts Nächtle
Mit Zitat antworten
  #24 (permalink)  
Alt 22-09-2006, 18:17
nichtsooft
 Registrierter Benutzer
Links : Onlinestatus : nichtsooft ist offline
Registriert seit: Apr 2006
Ort: Wien [AUT]
Beiträge: 385
nichtsooft ist zur Zeit noch ein unbeschriebenes Blatt
nichtsooft eine Nachricht über ICQ schicken
Standard

Nunja; womit ich nicht klar gekommen bin und was ich selbst jetzt nach langem Schlafe nicht durchblicke ist folgendes:

Ich sende eine Variable per URL and die download.php

die sieht so aus:

download.php?file=Ppl/bahnengolf/Herzogenburg07_2006/IMG_0165.JPG

da hol ich mir dann in der Datei per basename() den Dateinamen raus und füge den in den Header-befehl ein:
PHP-Code:
$dlfl basename($_GET[file]);

header("Content-Disposition: attachment; filename=$dlfl"); 
Logischerweise kennt sich das downloadscript jetzt absolut nicht mehr aus, weil es ja nicht weiss in welchem Verzeichniss die Datei "IMG_0165.JPG" liegt und wie mir ja schon mehrmals gesagt wurde, darf ich aber keinen Verzeichnisspfad in den Header schreiben!

Was die Verzeichniss- und Dateisicherheit angeht; So weit bin ich noch nichtmal gekommen!

Es ist schon schlimm dumm zu sein, aber wenigstens tut's nicht weh! *gg*
Mit Zitat antworten
  #25 (permalink)  
Alt 22-09-2006, 18:33
jahlives
 Master
Links : Onlinestatus : jahlives ist offline
Registriert seit: Jun 2004
Ort: Hooker in Kernel
Beiträge: 8.279
jahlives ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Dein Header Befehl würde aber einen Download verursachen und nicht die direkte Anzeige im Browser.
Und wieso kennst du den Pfad nicht ? Den haste ja immer noch in $_GET['file']. Aber wenn das Download Script direkt im Verzeichnis mit den Bildern liegt, dann brauchst du keinen kompletten Pfad sondern es reicht der Dateiname, weil PHP diesen Pfad dann als relativ betrachtet und das File im Verzeichnis sucht wo auch die PHP Datei liegt.
PHP-Code:
header("Content-type: image/jpg");
header("Content-disposition: inline; filename=$dlfl"); 
Müsste die Anzeige des Bildes erzwingen. Deine Version würde afaik erst einen Download erzwingen.
__________________
Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."
Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)
Mit Zitat antworten
  #26 (permalink)  
Alt 22-09-2006, 18:39
nichtsooft
 Registrierter Benutzer
Links : Onlinestatus : nichtsooft ist offline
Registriert seit: Apr 2006
Ort: Wien [AUT]
Beiträge: 385
nichtsooft ist zur Zeit noch ein unbeschriebenes Blatt
nichtsooft eine Nachricht über ICQ schicken
Standard

...würde einen Download erzwingen....
Darum heisst's ja auch "download.php"
Und wenn man dann noch die vorangegangenen Posts gelesen hat weiss man auch, dass die download.php nicht im Verzeichniss mit den Bildern ist.
Genau das ist ja das Problem!

Edit: Wenn jmd nen Blick drauf werfen will: LINK zum Projekt
Mit Zitat antworten
  #27 (permalink)  
Alt 22-09-2006, 18:46
jahlives
 Master
Links : Onlinestatus : jahlives ist offline
Registriert seit: Jun 2004
Ort: Hooker in Kernel
Beiträge: 8.279
jahlives ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Und wenn man dann noch die vorangegangenen Posts gelesen hat weiss man auch, dass die download.php nicht im Verzeichniss mit den Bildern ist.
Sorry zu wenig genau gelesen. In diesem Falle brauchst du den Pfad um readfile() mitzuteilen welches Bild ausgelesen werden soll.
In den Header brauchst du aber den Pfad nicht, da geht's nur um den Namen mit dem das Bild beim Client gespeichert werden soll. Da kannst du schreiben was du willst...
Wenn ich auf deinen Link klicke und das Bild öffnen will, kann der Typ nicht bestimmt werden. Also fehlt dir ggf ein
PHP-Code:
header("Content-type: image/jpg"); 
Gruss

tobi
__________________
Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."
Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)
Mit Zitat antworten
  #28 (permalink)  
Alt 22-09-2006, 18:52
nichtsooft
 Registrierter Benutzer
Links : Onlinestatus : nichtsooft ist offline
Registriert seit: Apr 2006
Ort: Wien [AUT]
Beiträge: 385
nichtsooft ist zur Zeit noch ein unbeschriebenes Blatt
nichtsooft eine Nachricht über ICQ schicken
Standard

hmm...? Hab ich eigentlich eingebaut!

Aktuell:
PHP-Code:
<?php

// declare the basic directory for security reasons
// Please do NOT attach a "/"-suffix !
$dlfl basename($_GET[file]);
$basedir 'pics/galerie';
// $diradd = trim($path_parts['dirname'], $basedir);


////////// SECURITY
// compare the entered path with the basedir
// $path_parts = pathinfo($_REQUEST['file']);
// if ($diradd != 0) {
// ANTI-CRACK-ATTEMPT
//   echo $_REQUEST['file'].'<br>';
//   echo $path_parts['dirname'].'<br>';
//   die ('coding good - h4x1ng bad!');}


// $datei = $_GET[file];
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Description: File Transfer");
header("Content-type: image/jpg");
header("Content-Disposition: attachment; filename=$dlfl");
header("Content-Transfer-Encoding: binary");
readfile($datei);
?>
Mit Zitat antworten
  #29 (permalink)  
Alt 22-09-2006, 18:55
kuddeldaddeldu
 Registrierter Benutzer
Links : Onlinestatus : kuddeldaddeldu ist offline
Registriert seit: Sep 2006
Beiträge: 437
kuddeldaddeldu ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hi, gut geschlafen?

Jetzt verstehe ich, was Dein Problem ist:
Du verwechselst da etwas entscheidendes. Diese Header, die Du da
setzt, sind Response-Header. In einfachen Worten: Das sind Informationen,
die der Browser auswertet, um zu wissen, was er mit dem Content ,
der danach kommt, anstellen soll/kann. Diesen Content lieferst Du doch
schon mit Deinem readfile. Der Name, den Du da in dem Header einträgst,
ist nur ein Vorschlag für einen Namen. Stell Dir vor, Du klickst irgendwo
auf einen Download, ein Fenster geht auf, wo Du auswählen kannst,
wohin Du das speichern willst. Jetzt findest Du den vorgeschlagenen
Namen "steigerungsfähig" und änderst den. Meinst Du, der Download
funktioniert dann nicht? Du könntest das auch leer lassen, dann würde
da download.php oder download.html erscheinen.
Also, um es kurz zu machen:
In dem Header den Dateinamen setzen und dann
readfile(dateipfad).

So, und nun probier das einfach mal aus. Die Pfadüberprüfung sollte
sich dann nicht mehr so schwierig gestalten.

LG
Mit Zitat antworten
  #30 (permalink)  
Alt 22-09-2006, 18:59
nichtsooft
 Registrierter Benutzer
Links : Onlinestatus : nichtsooft ist offline
Registriert seit: Apr 2006
Ort: Wien [AUT]
Beiträge: 385
nichtsooft ist zur Zeit noch ein unbeschriebenes Blatt
nichtsooft eine Nachricht über ICQ schicken
Standard

*looool*

Soll's das wirklich gewesen sein!? *dasKeyboardMitVielSchwungAufMeineHohlbirneSchmetter*
Muss ich gleich mal versuchen! *kopfschüttel*

Naja: Wie gesagt: ...wenigstens tut's nicht weh!
Mit Zitat antworten
Antwort

Lesezeichen


LinkBacks (?)
LinkBack to this Thread: https://www.php-resource.de/forum/php-developer-forum/76059-download-via-header-attachment.html
Erstellt von For Type Datum
foren attachments dl ohne login - Google Search This thread Refback 07-09-2011 12:51

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

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 15:03 Uhr.