Mit php Verzeichnis schützen

Hi Leute

Ein herzliches Hallo von meiner Seite erst einmal!

Mich will ein Problem nicht mehr in Ruhe lassen…
Auf meiner Seite gibt es einen externen und einen internen Bereich. Im internen Bereich befindet sich ein kleiner Download. Das Problem: beim Einloggen werden die Daten von der Datenbank verglichen und bei korrekter Eingabe eine Session ID gesetzt.
Dadurch kann ich aber lediglich das Aufrufen der Download Daten mit php gegen aussen verhindern. Bei einer direkten http Anfrage im Browser wird die Download Datei angezeigt. Ok, natürlich muss man zuerst den Pfad wissen, aber trotzdem. Es muss doch eine Möglichkeit geben, ein Verzeichnis zu schützen.
Natürlich gibt es die htaccess, nur möchte ich eigentlich nicht mein komplettes Loginsystem ändern.
Fällt euch da was ein, wie ich ein Verzeichnis schützen kann?

Grüsse aus der Schweiz!

1.) per htaccess schützen
2.) Wenn eingeloggt Datei mit PHP auslesen (readfile())

sebbo

sehe ich das richtig, mit readfile() kann ich dann aber nur einen Download starten und nicht die Datei im Browser abspielen lassen?
Das was ich suche, ist eine Möglichkeit, den html Befehl zu ersetzen mit einem PHP Befehl, damit ich den htaccess Schutz umgehen kann.
Bin grad ein bisschen verwirrt. Komischerweise finde ich nirgends das, was ich suche, auch über readfile() finde ich nicht 100% klare Beschriebe… lediglich Fragmente. :susp:

Wie wäre es mit file_get_contents()?

z.B.:

<?php $file = file_get_contents("bild.jpg"); header("Content-type: image/jpeg"); echo $file; ?>

Ah danke, das hatte ich gesucht! Ich habs gleich noch für mp3 Dateien abgeändert:

<?php $file = file_get_contents("url/test.mp3"); header("Content-type: audio/mp3"); header('Content-length: ' . filesize("url/test.mp3")); echo $file; ?>

Gut, ok, war wohl ein wenig zu euphorisch. Das echo $file; bezweckt gar nichts. Ich kann also zwar einen Stream laden, aber dann im ganzen Browserfenster und nicht irgendwo im Homepage Content. Hat vielleicht noch jemand einen Tipp?

  • readfile sollte da schon besser sein.

de2.php.net/manual/de/function.readfile.php

  • embed ist weder HTML noch ein Befehl, das ist einfach
    propritäre Syntax von Netscape. Ist seit über zehn Jahren durch
    das Element object ersetzt, was dann auch wirklich ein
    (X)HTML-Element ist.

  • Du referenzierst dann eben die PHP-Datei im Attribut data
    von object, eventuell zusammen mit einem dynamischen
    GET-Parameter wie einer session-Identifikation, anhand der du
    überprüfen kannst, ob die Datei rausgerückt werden soll oder
    nicht. Man kann stattdessen auch einen verschlüsselten,
    zeitabhängigen Parameter wählen, gibt es ganz verschiedene
    Möglichkeiten.

  • Man kann alternativ auch als Referenz das Pseudoprotokoll
    data: verwenden und damit den Kram direkt in die (X)HTML-Datei
    einbetten, funktioniert bei technisch aktuellen browsern, nicht
    aber bei allen, die auf dem technischen Stand von vor 12 Jahren
    sind (beim MSIE 6 geht es sicher nicht, bei neueren MSIEs weiß
    ich es nicht).

auf jeden fall readfile verwenden!!!

I’m back…

Hm, ich kann das irgendwie nicht hinbekommen. Vielleicht nochmals zur Klärung:

domain.ch/intern/download/musik.mp3
Da soll der htaccess Schutz den Zugriff verwehren.

domain.ch/intern/download.ph … =musik.mp3
Da soll das Stück im Content drin, also so wie mit embed oder object dargestellt und abgespielt werden.

Hat mir jemand ein genaueres Beispiel, denn ich finde readfile immer im Zusammenhang mit Forced Downloads und das bringt mir nix…

Danke euch!

[code]

<?php $file = $_GET['download']; header("Content-Type: audio/mpeg"); header("Content-Length: ".filesize($file)); readfile($file); ?>[/code]

ok, ich glaube, ich habe mich immer noch nicht ganz klar ausgedrückt :wink:
http://oepfeli.bplaced.net/projekte/marisacastella/index.php?section=sound

auf dieser Seite findet ihr eine Darstellung, wie ich sie haben möchte. Wenn ich auf einen Titel klicke, soll mir genau dieser Titel darunter geladen werden (und nicht als neue Seite oder ein gestarteter Download)…

Ich hoffe, das hilft weiter zum Verständnis :p

liebe Grüsse

ja, dann änder dein embed code halt um:

in

und die readfile.php:

<?php $file = $_GET['file']; header("Content-Type: audio/mpeg"); header("Content-Length: ".filesize($file)); readfile($file); ?>

Das solltest du vielleicht mit javascript machen.

So wie ich es verstanden habe, möchtest du es so wie jetzt, nur das die seite bei einem klick auf ein menüpunkt, nicht neugeladen wird.

ich habs jetzt nicht ausprobiert… aber ist es nicht so, dass header() vor einer Ausgabe stehen muss, sprich, wenn ich es so mache, wie du hummer es vorschlägst, dann wird das nicht funkionieren, oder lieg ich da falsch?

nein, ich möchte eigentlich nur, dass ich ein Musikstück mit php lade und nicht mit embed oder object, wo ein Musikstück durch ein allfälliges htaccess nicht geladen werden kann. Bei meinem Beispiel ist dies aber nicht relevant, da es sich um einen externen Bereich handelt. Man muss sich jetzt vorstellen, dass ich im internen Bereich das selbe Abspiellayout nochmals habe. Da ich nicht möchte, dass jemand irgendwelche Musikstücke vom internen Bereich hören kann, der nicht eingeloggt ist, möchte ich einen htaccess Schutz einbauen, der mit php umgangen werden kann, wobei man sich aber über das php anmelden muss.

hier mal ne kleine Demo:
http://hummer.bplaced.de/wav/

Hey super, danke vielmals für deine Demo! Klappt wirklich super. Wie genau hast du bei dir den Ordner mit htaccess geschützt?

Hi Leute

Ich habe doch nochmals eine Folgefrage:
folgendes lasse ich per readfile laden (load.php):

	$file = $_GET['file'];
	header("Content-Type: audio/mpeg");
	header("Content-Length: ".filesize("files/".$file)."");
	readfile("files/".$file);

	echo "<embed src=\"download/load.php?file=ordner/song.mp3\" loop=false autostart=false height=\"16\" width=\"350\">\n";

Das kommt dabei in Safari raus:

wie man gut sehen kann, wird nicht das gesammte mp3 File geladen. Dazu gibt es links und rechts so einen grauen Balken (das ist die Hintergrundfarbe, definiert mit CSS). Weiter wird das autostart=false im Safari ignoriert, es wird einfach nach dem begonnenen Laden abgespielt.

Im Firefox sowie im Internet Explorer sieht das ganze so aus (also richtig, genau so wie ich es mir wünsche, auch korrekt mit dem autostart=false):

Könnte das embed ein Problem darstellen? Das komische daran wäre, dass es vorher, bevor ich das Lied per readfile geladen habe, tiptop funktionierte…
Wie kann ich das erzwingen, dass das ganze File geladen wird?

Danke euch!

edit: übrigens erscheinen ein paar der selben Probleme ebenfalls bei der Demo von Hummer ein paar Beiträge weiter oben, damit ihr euch ein Bild davon machen könnt.

hm, ich brauche irgendwie immer noch einen input… hab jetzt den Herrn Google befragt. Jedoch will er mir nur Auskunft geben über Forced Downloads. Ich vermute, es könnte auch an einem Problem mit den header() etc. liegen. Sieht da jemand einen Fehler? Was könnte das verursachen, dass das mp3 File trotz der Anweisung autostart=false abgespielt wird?

Hi Leute

Nur um einen Schlussstrich zu ziehen: mein Fehler war folgendes: die type Angabe im Tag hatte ich vergessen. Jetzt funktioniert es perfekt unter allen drei Browsern.

Vielen herzlichen Dank nochmals an alle, die mir geholfen haben!