PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP-Problem: Weiterleitung auf Video



LogicalLimit
07.04.2006, 15:42
Heyho!
Ich möchte ein kleines script für meine Seite machen, das mir dabei hilft die auf der Seite befindlichen Videos nicht ohne weiteres runter laden zu können.
Habe das bisher folgendermaßen gemacht:
Eine mySQL-Tabelle VideoQueue, in der eine Zuordnung von SessionID zur gewünschten Video-ID steht.
Dann eine datei movieplayer.php, die die Videodatei anzeigt und nach dem öffnen die assoziation löscht, damit das Video nicht mehr runter geladen werden kann.
Der Movieplayer sieht so aus:

<?
include("classes/database.class");
include("classes/video.class");

$video = new Video();
$vid = $video->getReserved($_GET["sid"]);
$videoinfo = $video->getVideoInfo($vid);
$filename = $videoinfo["FILENAME"];
$video->clearQueue($_GET["sid"]);
header("Location: /videos/$filename");
?>

$video->getReserved($SessionID) gibt die Video-ID zurück, die der User bestellt hat, $video->getVideoInfo($vid) gibt ein Array mit Informationen über die Videodatei zurück und clearQueue($SessionID) löscht die assoziation von SessionID und VideoID.
Wenn ich die Zeile
$video->clearQueue($_GET["sid"]); heraus lasse, funktioniert alles super. Das Video, das in der Tabelle zur SessionID assoziiert ist, wird angezeigt, allerdings bleibt dann die Verbindung auch in der Tabelle und das Video lässt sich mehrmals aufrufen.
Wenn ich nun die o.g. Zeile wieder einfüge, verändert sich die Seite zwar zur MediaPlayer-Ansicht, aber es wird kein Video abgespielt. Habe auch schon die Variable $filename abgefangen und da steht der richtige Dateiname drin, habe also keine Ahnung, warum das nicht läuft :(

Habt ihr vielleicht ne Idee?
Freue mich auf eure Antworten.

Gruß, Alex

sono
07.04.2006, 18:00
1. Ich hoffe deine Dateien mit der .class endung liegen in einem .htaccess geschützen Bereich bzw auserhalb der Webroot sonst kanns sich jeder den Code von denen ausgeben lasse.

2. Sowie deine Weiterleitung aussieht kann jeder der denk Link zu Video kennt sich das Video direkt runterladen.
Sag mirs falls ich mich irre.

Mein Vorschlag zur Lösung :


<?php
/************************************************** ***********************************

Autor : Dominik Bonsch
Version : Alpha 0.2_3
Datum : 05.03.2006

************************************************** ************************************/
session_name('SESSION');
session_start();
error_reporting(0);

if(! $_SESSION['LOGIN']){
throw new Exception("NE NE SO bekommste nix !!");
}

$file = trim($_GET['fi']);

if(isset( $_GET['pa'])){
$path = trim($_GET['pa']);
}else{
$path = "";
}

$area = trim($_GET['ar']);

if ( isset($_GET['nn']) ){
$newname = $_GET['nn'];
}
else{
$newname = $file;
}

switch( $area ){

case 'files' : {
$prepath = "/files/data/";
break;
} // ENDE CASE

case 'pic' : {
$prepath = "/files/pics/";
break;
} // ENDE CASE

default: {
throw new Exception("GETFILEATTACK");
} // ENDE FUNKTION

} // ENDE SWITCH

header("Content-Disposition: attachment; filename=$newname");
if ( isset($_GET['fd']) ){
header("Content-Type: application/force-download");
}

try{
// Das musste selbst schreiben.
require_once ( "../app/functions/f_sys_strings.php" );

if ( !pruefe_filename( $file ) ){
throw new Exception("GETFILEATTACK");
}
// Auslesen des nun hoffentlich auf jeden fall sicheren Files
readfile("$prepath$path$file");

} // ende tryblock

catch ( Exception $exception ){
echo $exception->getMessage();
}
?>

Ich denke mal es ist klar was passiert und dass du mit dem File deine Dateien von auserhalb der Webroot laden kannst ohne das je jemand dran kommt wenn du es nicht willst.

Du solltest das ganze allerdings schön absichern, also filename auf / udn ./ usw prüfen, so mach ichs , aber ein wenig arbeit will ich dir noch lassen.

PS falls du php4 hast musst du die Exceptions rausschreiben, is klar ne ?

Gruß Sono

LogicalLimit
07.04.2006, 19:25
Hm... vielen Dank, aber das ist irgenwie nicht so ganz das, was ich mir erhofft hatte :(
Die Funktionsweise und der Aufbau des scripts sollten schon wie oben beibehalten werden. Ich bin nur total verwirrt, wieso es funktioniert, wenn ich die Assoziation nicht lösche, obwohl garnicht mehr auf sie zugegriffen werden muss.
In dem clearQueue steht übrigens nur der MySQL-Befehl "DROP FROM Queue WHERE SessionID = '$SessionID'"

Gruß, Alex

sono
07.04.2006, 21:50
Dann eine datei movieplayer.php, die die Videodatei anzeigt und nach dem öffnen die assoziation löscht, damit das Video nicht mehr runter geladen werden kann.

Klär mich mal auf was du mit assoziation meinst.

Hast du die videos irgendwo , machst nen link drauf und nach dem aufrufen löschst du den link drauf ? Oder hab ich das falsch verstanden .


Wenn ich die Zeile
PHP-Code:
$video->clearQueue($_GET["sid"]);
heraus lasse, funktioniert alles super. Das Video, das in der Tabelle zur SessionID assoziiert ist, wird angezeigt, allerdings bleibt dann die Verbindung auch in der Tabelle und das Video lässt sich mehrmals aufrufen.
Wenn ich nun die o.g. Zeile wieder einfüge, verändert sich die Seite zwar zur MediaPlayer-Ansicht, aber es wird kein Video abgespielt. Habe auch schon die Variable $filename abgefangen und da steht der richtige Dateiname drin, habe also keine Ahnung, warum das nicht läuft

Das lässt darauf schliesen , dass du dem donwload quasi die Datei unterm Arsch wegziehst wenn ich das richtig verstanden habe.

Du löschst schon während des Downloads den Link auf die Datei wenn micht alles täuscht.

Kann das sein ?

Gruß Sono

hehejo
07.04.2006, 22:02
Nein.
So wie ich das gelesen habe, hat er einfach eine Tabelle in einer Datenbank in der die aktuelle SessionId mit einer Videodatei verknüpft ist.

LogicalLimit
08.04.2006, 12:34
Nein.
So wie ich das gelesen habe, hat er einfach eine Tabelle in einer Datenbank in der die aktuelle SessionId mit einer Videodatei verknüpft ist.

Richtig!

Und mit assoziation ist eben genau diese Verknüpfung von SessionID zur VideoID gemeint.
Nachdem das script die VideoID ausgelesen hat, weiß es also, welches Video der User haben möchte und somit sollte auch die Verknüpfung problemlos gelöscht werden können... sollte...


Gruß, Alex