[php] download nach login

Frostbeule2k

Ensign
Registriert
Feb. 2006
Beiträge
223
Hey Jungs und Mädels,

habe da mal wieder eine kleine Frage, wie bewerkstellige ich das ein File erst heruntergeladen werden kann wenn man eingeloggt ist, d.h. das selbst wenn man die Datei direkt verlinkt man auf eine Loginpage zurückgeworfen wird?

Danke!
Gruß Frostbeule2k
 
Du prüfst, ob der Besucher angemeldet ist und zeigst ihm entweder das Anmeldeformular oder reichst ihm die Datei durch, die sich an einem nicht von außen zugänglichen Ort befindet.

greetings, Keita
 
ahhhja haste nen beispiel quelltext wie das funktioniert mit dem durchreichen der datei? das mit dem prüfen ob der benutzer die berechtigung hat habe ich schon, funktioniert auch
 
das sind eigentlich grundlagen die man draufhaben sollte^^
also:

PHP:
<?php 
if(isset($_SESSION['username']))  { 
echo "<a href='downloadlink'>Link</a>";
} else {
echo "sie sind nicht eingelogged";
} 
?>

das gleiche kannst du mit $_COOKIE oder sonst irgendwas machen ^^ aber is einfach nur ne if abfrage, die das prüft
 
joa du sagst es ja "eigentlich"... und was passiert wenn man jetzt den downloadlink direkt angibt? wie funktioniert das dann??? steig da grad nicht wirklich durch
 
Dann musst du die Zeile
PHP:
echo "<a href='downloadlink'>Link</a>";
anpassen. 'downloadlink' ersetzt du durch den *trommelwirbel* Link der zum Download angebotenen Datei, und 'Link' kannst du so stehen lassen oder du denkst dir nen tollen Text aus.
 
@ Revontulet

Ich denke nicht, dass er das wissen will.
Dein Skript ist ja schön und gut, aber seine Frage ging glaube ich in eine andere Richtung.

Das Problem, was Frostbeule2k hat, ist mit deinem Skript ja überhaupt nicht gelöst.
Denn nun kann man einfach den von dir genannten "downloadlink" in die Adresszeile seines Web-Browsers eingeben und sich die Datei schön einfach herunterladen. Die Datei, in dem der von dir gepostete PHP-Code steht, wird dann ja vollkommen ignoriert.

@ Frostbeule2k

Um dies zu verhindern, musst du das Verzeichnis, in dem die zum Download bereitstehenden Dateien liegen, mit einer .htaccess-Datei schützen. Was du dafür genau alles in die .htaccess-Datei schrieben musst, frag' mich nicht. :)
 
ok danke "Computer Freak" werde mal schauen wie das geht... .htaccess hat bei ir zwar noch nie funktioniert aber ich versuch es nochmal ;)
 
Ach so war das gemeint.
Das könnte man relativ einfach in folgender Form umgehen.
PHP:
<?php 
if(isset($_SESSION['username']))  { 
$file = "PfadzurDatei/Dateiname.Dateiendung";
$filename = basename($file);
$size = filesize($file);
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename="$filename");
header("Content-Length: $size");
readfile($file);
} else {
echo "sie sind nicht eingelogged";
} 
?>
Computer Freak schrieb:
@ Frostbeule2k

Um dies zu verhindern, musst du das Verzeichnis, in dem die zum Download bereitstehenden Dateien liegen, mit einer .htaccess-Datei schützen. Was du dafür genau alles in die .htaccess-Datei schrieben musst, frag' mich nicht. :)
Das mit dem .htaccess-Zeug finde ich in diesem Zusammenhang recht unkomfortabel, schliesslich hat der User an dieser Stelle seine Login-Daten schon eingegeben. Des Weiteren würde er mit dieser Methode Zugriff auf ein ganzes Verzeichnis kriegen, und nicht nur auf eine einzelne Datei.
 
Zuletzt bearbeitet:
Mal ne Idee mit DB-Lösung:

Um Direktdownload zu verhindern oder das ein User weitere Dateien im gleichen Ordner laden kann, könnte man auch die auf Platte liegenden Dateinamen derart modifizieren (kryptische Zahlen-Buchstabenkombination), dass es sehr schwierig wird, diese herauzubekommen und damit direkt und/ oder ohne Login anzuwählen und zu laden. HTTP-Anzeige des Ordners sollte per htaccess sowieso unterbunden werden. Nur php hat das Recht.

Weiterhin darf dann nur php bzw. die Datenbank den tatsächlichen Dateinamen kennen. Der User sieht und bekommt immer nur einen virtuellen Dateinamen/ Link, der aber ohne Gegenprüfung und Abgleich serverseitig nix bringt. Die angeforderte Datei wird dann natürlich unter neuem Namen gesendet.

Bsp:
- Datei auf Platte heisst "4312hjk4rbvdsank4287"
- User fordert "spass.rar" an.
- php prüft userlogin und vergleicht zudem "spass.rar" mit den per DB vermerkten tatsächlichen Dateinamen
also in spalte 1 der Tabelle steht "spass.rar" in spalte 2 "4312hjk4rbvdsank4287"
- Stimmt das überein, wird also was gefunden, dann Ausgabe zum Download, die Datei wird nun als "spass.rar" versendet
- Falls nicht Fehlermeldung

Diese Methode wäre natürlich nie 100% sicher. Muss man halt abwägen.
Also nur so als Denkansatz und evt. Möglichkeit. Habe jetzt keinen Bock hier komplette Scripte dazu zu posten. :)

Alternativ ginge sowas sicher auch mit Benutzerverwaltung und -gruppen zu realisieren.
 
Und woher kennt der User den Quellcode? Diesen Pfad bekommt er nie zu sehen.
 
Prinzipiell funktioniert es so, wie Revontulet es beschrieben hat, nur liegen die Dateien außerhalb des document roots, damit - wie ich heute morgen geschrieben hatte - kein Zugriff von außen möglich ist. Ansätze, die nach "security through obscurity" arbeiten, sind keine gute Idee, wenn man schon Sicherheitsmechanismen einbaut, sollten sie auch ordentlich arbeiten.

greetings, Keita
 
@Keita
Ich weiss. Es war lediglich eine Alternative, wenn natürlich nicht beste. Und falls eben der jeweilige webspace Deinen kalr sicheren Vorschlag nur beschränkt ermöglicht, solls ja auch geben. :)

Revontulet schrieb:
Und woher kennt der User den Quellcode? Diesen Pfad bekommt er nie zu sehen.
Welchen Quellcode oder pfad? Der User bekommt nen Link zum klicken vorgesetzt/ angezeigt. Mehr braucht er nicht zu kennen. :)
Nur der Server kennt den wahren Namen eben per DB oder festen Algorithmus. Eben "security through obscurity". :p
 
Zuletzt bearbeitet:
@ Keita

Ja gut, nur dazu muss man eben Zugriff auf außerhalb des Document Roots haben.
Wenn man das nicht hat - was gar nicht so selten vorkommt - dann funktioniert diese methode nicht und dann bleibt eben htaccess übrig.
 
eben ich habe nen server bei strato und habe da nur berechtigung auf meinem webspace und komme nirgends anders hin... die lösung von revontulent leuchtet mir aber auch nicht ein, da kann man ja trotzdem den genauen dateipfad angeben, oder übershe ich da grad was?
 
Wenn man außerhalb des document roots keine Schreibrechte hat, wäre jetzt ein willkommener Anlaß, um über einen Wechsel nachzudenken ;) Ganz im Ernst, wenn man anfängt sich mit dynamisch generierten Dingen zu beschäftigen, sollte man sich auch mit dem Thema Sicherheit beschäftigen und ggf. die technischen Voraussetzungen dafür schaffen. Was passieren kann, wenn man sich zu spät mit diesem Thema auseinandersetzt, sieht man ja eindrucksvoll bei studivz :D

greetings, Keita
 
die lösung von revontulent leuchtet mir aber auch nicht ein, da kann man ja trotzdem den genauen dateipfad angeben, oder übershe ich da grad was?
Nein, du übersiehst nichts. Ich hab doch gesagt, dass Keitas/Revontulets Methode nur funktioniert, wenn man Zugriff auf außerhalb des Document Roots hat. Sonst kann man, wie du auch richtig erkannt hast, einfach per dateipfad draufzugreifen.
deswegen sag ich ja schon die ganze zeit --> htaccess ;)
 
ok ich probier erstmal htaccess und wenn das nicht ganz hinhaut dann werde ich wohl mal keita´s rat befolgen und nach nem andere anbieter schauen... thx euch allen für die schnelle hilfe, dachte nicht das ich so shcnell so viele antowrten bekomme
 
So viel gibts da nicht zu diskutieren.
Computer Freak hat die Lösung schon lange gebracht, dass mit dem htaccess ist gleichzeitig absolut simpel und sicher.

EDIT:

Ah, ich habs mir grad nochmal überlegt. Vermutlich habt ihr gar nicht verstanden wie man sowas eigentlich machen müsste mit htacess, als ihr gemeint habt es sei 'unkonfortabel' weil man dann ja nochmal einloggen müsste. Das muss man nicht!

Der Trick dabei ist, dass die PHP Datei den Download aus dem geschützten Verzeichnis aufruft. Da die PHP Datei selbst auf dem Server liegt, hat sie die Berechtigung Dateien aus dem geschützten Bereich aufzurufen. Dabei muss der User KEIN htaccess Passwort eingeben da die PHP Datei dies für ihn umgeht. (Würde er hingegen ohne die PHP Datei auf die Datei zugreiffen wollen, dann würde er am htaccess scheitern da er im gegensatz zur PHP Datei da ja nicht einfach drauf zugreiffen darf.

Hier mal ein Beispiel, welches auf demjenigen von Revontulet beruht, jedoch das mit dem htacess beinhaltet:

PHP:
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=\"datei.exe\"");
$file = "verzeichnis/datei.exe";
readfile($file);

Zeile 1 sagt: Was jetzt kommt muss gedownloadet werden.
Zeile 2 sagt: Der Name desjenigen ist datei.exe (dabei ist es egal wie das File auf dem Server heisst... das File kann auf dem server mickey.mp3 heissen und trotzdem als donald.exe zum download gesendet werden...)
Zeile 3 definiert die variable die den Pfad zur wirklichen Datei enthält. der Verzeichnis muss hierbei Passwortgeschützt sein (darin besteht ja der Trick)
Zeile 4 sendet dann das File aus dem Passwortgeschützten Bereich unter Umgehung des htaccess Schutzes zum User der es downloaden kann.

Diese Methode hat folgende Vorteile:

1. Der User wird den Pfad zur Datei nicht kennenlernen (statdessen nur den zum PHP File)
2. Auch wenn der Pfad bekannt wäre, könnte die Datei nciht heruntergeladen werden (bzw. halt nur über die PHP Datei für die man ja eingeloggt sein muss)
 
Zuletzt bearbeitet:
Zurück
Oben