• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Vor Auslieferung einer Datei auf DB-Eintrag prüfen

Tobi44

Mitglied
Hallo,

habe wieder mal was vor, wovon ich keinen blassen Schimmer Ahnung habe, wie ich es anstellen soll: Vor der Auslieferung von Dateien an den User soll eine Prüfung stattfinden, ob ein Eintrag in der Datenbank existiert. Wenn ja, soll die Datei rausgehen, ansonsten nicht.
Eigentlich eine serverseitige Konfiguration erforderlich, nur wie bringe ich meiner htaccess bei, mit der Datenbank zu kommunizieren?

Oder wie regelt "man" sowas "richtig"???
 
Soetwas macht man mit PHP. Verbindung zur Datenbank herstellen, DB auswählen, Select abschicken und bei einem Treffer die Datei ausliefern.
 
Es geht hier um eine ZIP-Datei, deren Link jeder Benutzer sieht (oder auch herleiten kann). Erst jedoch wenn er seine Handynummer verifiziert hat, soll er Zugriff auf die Datei haben.
 
Habe mir das gerade mal reingezogen. Hätte nicht gedacht, dass das so einfach gehen soll.

Fragen: Warum öffnet der die Datei? Wo kommt das $pid her? Was bringt es? Und jetzt haperts an meinem logischen Verständnis. Was soll ich in meinem Fall in das Array schreiben? Was soll ich überhaupt mit einem Array?
 
Guck Dir mal die Antwort 9 an, das ist vielleicht etwas besser, weil ohne $pid. Dass Du natürlich die Berechtigung abprüfen musst, in welcher Form auch immer, ist ja so oder so klar. Und warum er die Datei öffnet, ist klar, damit das Script sie nachher an den Browser mittels fpassthru schicken kann..
 
Da steht, ich soll
<Limit GET POST>
order deny,allow
deny from all
</Limit>
in meine htaccess packen. Mache ich das, ist das Verzeichnis tot.
 
Also mit .htaccess da bin ich nicht so sattelfest :???: Aber was bitte heißt "Mache ich das, ist das Verzeichnis tot."? Du hast aber schon für die ZIP-Datei(en) die Du zum Download anbietest ein seperates Verzeichniss erstellt?
 
Das hier

Code:
<Limit GET POST>
order deny,allow
deny from all
</Limit>

sperrt jeglichen Zugriff über HTTP in dem Verzeichnis und allen Unterverzeichnissen in dem dieser Code steht (als .htaccess-Datei). Kürzer kann man auch schreiben:

Code:
deny from all

Wenn Du z.B. folgende Verzeichnisse hast

Code:
/
/verzeichnis1/
/verzeichnis2/
/verzeichnis2/unterverzeichnis1/
/verzeichnis3/

und eine .htaccess-Datei mit o.g. Inhalt in / ablegst, dann kann man auch keines der Unterverzeichnisse mehr zugreifen, also weder verzeichnis1, noch verzeichnis2, auch nicht verzeichnis3.

Wenn Du die .htaccess-Datei mit o.g. Inhalt in /verzeichnis2/ ablegst, dann ist einzig der Inhalt von /verzeichnis2/ inkl. dessen Unterverzeichnis /verzeichnis2/unterverzeichnis1/ geschützt.
 
sperrt jeglichen Zugriff über HTTP in dem Verzeichnis und allen Unterverzeichnissen in dem dieser Code steht (als .htaccess-Datei).

Und dieser PHP-Code macht die Auslieferung des Files möglich? Das wäre ja genial.

Dummerweise liegen meine php-/html-Dateien, die die ZIP-Dateien verlinken, also die php-/html-Dateien die der User natürlich betrachten muss, genau in dem VZ, wo eben diese ZIPs auch sind...
 
Das ist kein PHP-Code. Das sind Konfigurationszeilen für das Apache-Modul mod_rewrite. Das hat so viel mit PHP zu tun wie eine Orange mit einem Apfel ;)

Wenn Du nur bestimmte Dateitypen sperren willst, kannst Du auch einen Apache-eigenen Filter verwenden. Z.B.

Code:
 <Files ~ "\.(zip)$">
deny from all
</Files>

und schon sind alle ZIP-Dateien in dem Verzeichnis vor Zugriff per HTTP geschützt. Siehe auch:
core - Apache HTTP Server
 
Das hat sich jetzt auf den in der verlinkten Seite stehenden PHP-Code bezogen:
Download durch Passwort schtzen
PHP:
<?php
if ( $user==$user_name && $password==$user_password )
   {
        header("Content-Type: application/zip;");
        header("Content-disposition:attachment;filename=$file");
        $fd = fopen("files/$file", "rb");
        rewind($fd);
        fpassthru($fd); 
      }
      else {
        echo "BlaBla. Nix da.";
      }
   } // end if $user and $password given
else
   {
      define(SCRIPT_FILENAME,substr(strrchr($SCRIPT_NAME, "/"), 1));

      print('
<html>
   <body>
      <form action="'.SCRIPT_FILENAME.'" method="POST">
         Benutzername: <input name="user"><br>
         Passwort: <input type="password" name="password">
         <input type="hidden" value="'.$file.'" name="file">
      </form>
   </body>
</html>');
?>
 
Hallo,

nun versuche ich, dieses Feature in die Tat umzusetzen.

Ich möchte für meine Benutzer bestimmte Dateien erst ausgeben, wenn ein entsprechender Datenbankeintrag vorhanden ist. Diese Überprüfung existiert bereits.
Nur wie löse ich, dass die Datei nicht direkt beim Seitenaufruf als Download angeboten wird, sondern 1. von einem Webplayer wie Flowplayer geladen werden darf, und 2. per Link abrufbar ist?

Danke
 
Die "Seite" musst Du einfach nur als URL für die Video-URL angeben, und natürlich den Content-type über PHP korrekt setzen. Diese URL kann man dann genauso gut per Link aufrufen.
 
Du hast eine URL deiner PHP-Datei, z.B.:

Code:
http://www.example.com/beispiel.php

Angenommen Du generierst darüber ein Bild, also mit Content-type "image/jpeg", dann kannst Du diese Datei auch per img-Element einbinden und so das Bild anzeigen:
HTML:
<img src="http://www.example.com/beispiel.php" alt="">

Wenn Du jetzt ein Video ausgeben willst, dann musst Du in dem Fall natürlich einen Content-type passend zum Video schicken und kannst das die URL z.B. mit HTML5 so anzeigen lassen:

HTML:
<video src="http://www.example.com/beispiel.php"></video>

Da Du das Video nur nach Login anzeigen lassen willst, kannst Du bei letztgenanntem Code natürlich nicht das Loginformular innerhalb des <video>-Elements anzeigen. Das musst Du auf der Seite machen die das <video>-Element enthält.

Hinweis: die o.g. Beispiel-URLs müssen nicht zwingend mit http geschrieben werden ;)
 
Hmm. Irgendwie komme ich nicht hinterher.

Habe in der htaccess des Verzeichnisses in dem die Videos liegen, die Beschränkung drin, sodass niemand die Datei direkt aufrufen kann.

Habe eine video.php, in der einfach mittels HTML ein Video (aus diesem VZ) über den Flowplayer eingebettet ist. Darunter befindet sich dann nochmal ein Link, der direkt zur Videodatei führt. Beides klappt momentan natürlich nicht, da weder der Player die Datei bekommt noch der User der den Link anklickt - logisch.
Nur wie stelle ich es jetzt an, dass sowohl der Player als auch der Link das Recht haben, die Datei zu bekommen?
 
Wie schon gesagt:

Verlinken:
HTML:
<a href="video.php">Link</a>

Video anzeigen:
HTML:
<video src="video.php"></video>

Und video.php muss
a) die Zugriffsrechte prüfen, und wenn diese zulässig sind:
b) sowohl den Content der Video-Datei als auch einen passenden Content-type ausliefert.

Wenn die Zugriffsrechte nicht zulässig sind, müsste sie irgendetwas anzeigen was beim Aufruf per Link den Nutzer nicht irritiert und beim Aufruf als Video evtl. nur eine Fehlergrafik ausliefern.
 
Hallo,

ich glaube, ich bin zu dumm dafür!

PHP:
<?php if(!empty($checkuser)) {
header("Content-type: video/flv"); 
	$getvideofileforplayer = fopen("video_file.flv", "rb");
	rewind($getvideofileforplayer);
	fpassthru($getvideofileforplayer);
?>
<a 
	href="video.php" 
	style="display:block;width:700px;height:394px;" 
	id="player">
</a>
<?php } ?>

Das ist meine Überprüfung, wenn der User die Rechte hat, bekommt er die Datei - allerdings in unendlicher Textform in Hieroglyphen!

Edit: Nun habe ich es korrigiert, dass der header auch mitgeschickt wird (wurde er nicht, weil davor bereits Ausgaben kamen :-)). Leider bekommt der User nun beim Aufruf der php-Datei die Datei zum Download angeboten oder der Browser spielt sie direkt ab. Ich möchte aber weiterhin dass die Datei dann in meinem Player auf der html-Seite abgespielt wird!
 
Zuletzt bearbeitet:
Zurück
Oben