[PHP] sessie probleem in FF (in IE werkt het wel)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Anoniem: 104881

Topicstarter
Hallo,

Ik gebruik onderstaande code (een php bestande genaamd play.php) om een video af te spelen. Mijn probleem is niet dat ik geen session_start gebruik dat gebruik ik namelijk wel (helemaal boven aan de pagina), maar de rest van de pagina heb ik voor het overzicht even weggelaten.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  <? 
  $_SESSION["EchoOn"] = "Ja"; 
  ?> 
  <div id="player"> 
    <object id="MediaPlayer" codebase="http://activex.microsoft.com/activex/controls/mplayer/...f.cab#Version=6,4,7,1112" type="application/x-oleobject" standby="Loading Microsoft Windows Media Player components..."  classid="CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95" width="<?=$Width?>" height="<?=$Height?>"> 
      <param name="FileName" value="video.php?V=<?=$_GET["V"]?>&W=<?=$VideoWidth?>" /> 
      <PARAM NAME="stretchToFit " VALUE="0"> 
      <param name="ShowControls" value="1" /> 
      <param name="AnimationAtStart" value="0" /> 
      <param name="ShowStatusBar" value="1" /> 
      <param name="ShowDisplay" value="0" /> 
      <param name="Autostart" value="1" /> 
      <param name="TransparentAtStart" value="0" /> 
        <embed 
        name = "MediaPlayer" 
        stretchToFit = "0" 
        type = "application/x-mplayer2" 
        pluginspage = "http://www.microsoft.com/Windows/MediaPlayer/download/default.asp" 
        src    = "video.php?V=<?=$_GET["V"]?>&W=<?=$VideoWidth?>" 
        autostart = "1" 
        showcontrols = "1" 
        showdisplay    = "0" 
        showstatusbar = "1" 
        width = "<?=$Width?>" 
        height = "<?=$Height?>" 
        ></embed>   
    </object> 
  </div>


Zoals te zien is wordt er een bestand video.php aangeroepen. Ik heb voor deze opzet gekozen, omdat de bezoeker niet mag zien vanaf welke url (die verwijst naar een streaming server) de video gestreamd wordt. Video.php echoot de url onder voorwaarde dat $_SESSION["EchoOn"] op "Ja" staat. Vervolgens wordt meteen $_SESSION["EchoOn"] op "Nee" gezet, zodat een bezoeker niet de verwijzing die te vinden is bij de eigenschappen van het media player object (iets van video.php?V=1&W=320) kan knippen en plakken in de browser om zo alsnog achter de locatie op de streaming server te komen.

Hier de code van video.php:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<? 
session_start(); 
include_once("../include.php"); //verbinding met db 
$video = $_GET['V']; 
$sql = "SELECT `url` FROM `video` WHERE `id` = $video"; 
$query = mysql_query($sql) or die(mysql_error()); 
$result = mysql_fetch_object($query); 
$vid = "$result->url"; 
$bitrate = 0; 
switch ($_GET["W"]) { 
    case "160": 
        $bitrate = "43"; 
        break; 
    case "320": 
        $bitrate = "282"; 
        break; 
    case "512": 
        $bitrate = "564"; 
        break; 
    case "640": 
        $bitrate = "1073"; 
        break;        
} 
$url = "mms://adresvandestreamingserver/" . $bitrate . "-" . $vid . ".wmv"; 
if ($_SESSION["EchoOn"] == "Ja") { 
    echo $url; 
} 
?>


Bovenstaande oplossing werkt perfect in IE. In FF wordt er echter geen video afgebeeld, omdat (ik na onderzoek achter ben gekomen) de variabele $_SESSION["EchoOn"] niet herkend wordt of in ieder geval $_SESSION["EchoOn"] niet de waarde "Ja" heeft. Kennelijk kan door FF video.php niet 'in dezelfde sessie kijken' als waar play.php de variabele een waarde geeft.
Ik heb het idee dat dit komt, doordat play.php nog niet helemaal geladen is als video.php al wordt aangeroepen en dat zodoende de session_start in video.php geblockt wordt, waardoor de sessiedata vervolgens in video.php niet beschikbaar is.
Ik vermoed dat de reden dat het in IE wel werkt en in FF niet iets met cookies te maken heeft, maar het fijne weet ik hier niet van.

Wat ik dus wil is dat mijn oplossing ook in FF werkt en dan uiteraard voor zoveel mogelijk gebruikers (dus niet alleen gebruikers met bepaalde cookie-instellingen).

Is er iemand die me kan vertellen hoe ik bovenstaande oplossing aanpas, zodat deze ook in FF zal werken?

Ik heb al geprobeerd om met session_name de sessie een naam te geven en deze sessie dan ook weer op te roepen in video.php, maar ook dit geeft geen resultaat.

Ook heb ik al getest of het feit dat eerder in de code (dus voor het embed gedeelte dat door FF wordt gebruikt) ook al een verwijzing naar video.php staat er voor zorgt dat $_SESSION["EchoOn"] weer op "Nee" wordt gezet, maar dit is niet het geval.

Acties:
  • 0 Henk 'm!

  • EnsconcE
  • Registratie: Oktober 2001
  • Laatst online: 19-06 00:07
Even een vraag de andere kant op:
Wil je voorkomen dat men download of wil je direct linking voorkomen?

Acties:
  • 0 Henk 'm!

  • MrNGm
  • Registratie: Augustus 2004
  • Laatst online: 31-03 09:35
Ligt het probleem niet bij FireFox zelf? Afaik zijn $_SESSION variabelen alleen op de server te verkrijgen. Cookies zijn een heel ander verhaal.

Het lijkt met niet raar dat het in IE wel werkt en in FF niet. Waarom? Volgens mij heeft IE standaard het MediaPlayer ActiveX object ingebouwd, terwijl je voor FF een aparte plugin moet hebben.
Edit: kan best zijn dat ik het fout heb, ik gebruik immers Opera :)

Over EnsconcE, voorkomen van downloaden gaat lastig als je zo'n openbare site hebt :+. Overigens kan je het bestand nog wel gewoon downloaden met bijvoorbeeld SDP, je moet alleen met wat andere tools erachter zien te komen wat de URL is.

[ Voor 5% gewijzigd door MrNGm op 01-12-2006 17:44 ]


Acties:
  • 0 Henk 'm!

  • EnsconcE
  • Registratie: Oktober 2001
  • Laatst online: 19-06 00:07
SDP?

Ik weet dat je het downloaden niet tegengaat, daarom wil ik van de TS weten wat hij wil. Ik snap de context van de code namelijk niet helemaal.

offtopic:
Je kan altijd nog screencapture doen 8)

Acties:
  • 0 Henk 'm!

Anoniem: 104881

Topicstarter
Wil je voorkomen dat men download of wil je direct linking voorkomen?
Het video file wordt gestreamd vanaf een streaming server dus 'normaal' downloaden kan sowieso niet. De url moet echter niet bekend worden omdat de bezoeker moet betalen om de video te zien. Het is dus niet de bedoeling dat deze even naar de eigenschappen van de media player kijkt om vervolgens de url zelf vanuit een media player (niet embedded op de website) op te vragen.
Het lijkt met niet raar dat het in IE wel werkt en in FF niet. Waarom? Volgens mij heeft IE standaard het MediaPlayer ActiveX object ingebouwd, terwijl je voor FF een aparte plugin moet hebben.
Edit: kan best zijn dat ik het fout heb, ik gebruik immers Opera
Dat is het probleem niet want ik heb die plugin geinstalleerd. Als ik verder in video.php:
if ($_SESSION["EchoOn"] == "Ja") {
echo $url;
}
vervang door:
echo $url;

dan werkt het ook in FF!! Het probleem zit hem dus echt in die sessievariabele...
Overigens kan je het bestand nog wel gewoon downloaden met bijvoorbeeld SDP, je moet alleen met wat andere tools erachter zien te komen wat de URL is.
Probeer je hier te suggereren dat deze manier van de url afschermen niet waterdicht is? De url zit toch verborgen in het PHP-bestand video.php. Als ik dan die check op die sessievar $_SESSION["EchoOn"] doe dan kun je toch met geen enkel tool achterhalen wat die url dan is?

Acties:
  • 0 Henk 'm!

  • spine
  • Registratie: Juni 2001
  • Niet online

spine

VISHUDDHI

Anoniem: 104881 schreef op vrijdag 01 december 2006 @ 18:53:
Probeer je hier te suggereren dat deze manier van de url afschermen niet waterdicht is? De url zit toch verborgen in het PHP-bestand video.php. Als ik dan die check op die sessievar $_SESSION["EchoOn"] doe dan kun je toch met geen enkel tool achterhalen wat die url dan is?
Het is nooit helemaal waterdicht aangezien de persoon die het bekijkt niet serverside zit en dus altijd de url zou kunnen achterhalen :)

Je kan in dit geval misschien beter werken met een unieke code die je in een database/text-filetje opslaat en éénmalig kan opvragen. Dan hoef je niet met een sessie te werken. Eventueel ook op die manier toegang geven tot de file die gestreamed moet worden als je daar toegang tot hebt.

[BSDFreaks.nl] [www.Dark-Future.org] [Alizarin.nl]


Acties:
  • 0 Henk 'm!

  • EnsconcE
  • Registratie: Oktober 2001
  • Laatst online: 19-06 00:07
Anoniem: 104881 schreef op vrijdag 01 december 2006 @ 18:53:
Probeer je hier te suggereren dat deze manier van de url afschermen niet waterdicht is? De url zit toch verborgen in het PHP-bestand video.php. Als ik dan die check op die sessievar $_SESSION["EchoOn"] doe dan kun je toch met geen enkel tool achterhalen wat die url dan is?
Je data belandt aan de andere kant van de lijn, om deze reden alleen al kunnen mensen het bestand kopieren. Geld verdienen doe je niet alleen door een filmpje, maar het hele pakket er om heen, maar dat terzijde.

Je kan het ook doen door het bestandsnaam te veranderen en de video.php het bestandsnaam om te zetten naar het echte bestandsnaam.
PHP:
1
$url = "mms://adresvandestreamingserver/" . sha1($bitrate) . "-" . crc32($vid) . ".wmv";

Je kan het ook een stap hoger doen en dan je file aan de hand van de sessie van de gebruiker te renamen of weg te schrijven. Dan is het bestand er niet meer na het kijken.

Edit:
Mocht je de waterdichte techniek vinden, zorg dan maar voor een zaakwaarnemer:
Google, MPAA, Youtube, enz. ;)

[ Voor 5% gewijzigd door EnsconcE op 01-12-2006 20:31 ]


Acties:
  • 0 Henk 'm!

Anoniem: 104881

Topicstarter
wederom bedankt voor de reacties!
Je kan in dit geval misschien beter werken met een unieke code die je in een database/text-filetje opslaat en éénmalig kan opvragen. Dan hoef je niet met een sessie te werken. Eventueel ook op die manier toegang geven tot de file die gestreamed moet worden als je daar toegang tot hebt.
Hoe zou ik dit aan moeten pakken dan? Ik geloof dat ik dit niet helemaal kan volgen. Zou je iets specifieker kunnen toelichten hoe dit in zijn werk gaat?
Je kan het ook doen door het bestandsnaam te veranderen en de video.php het bestandsnaam om te zetten naar het echte bestandsnaam.
Ik zie niet echt in hoe dit beter zou moeten werken. Dan moet video.php toch alsnog uiteindelijk de url inclusief de juiste videonaam retourneren?
Je kan het ook een stap hoger doen en dan je file aan de hand van de sessie van de gebruiker te renamen of weg te schrijven. Dan is het bestand er niet meer na het kijken.
Dit is niet echt een optie omdat het om een streaming video bestand gaat dat nogal groot is. Het bestand staat op een server van een externe partij die alleen de streaming dienst verzorgt. Als ik het bestand ga renamen dan kunnen andere bezoekers het niet gelijktijdig bekijken en tijdelijke een kopie maken zou veel te langzaam gaan...

Acties:
  • 0 Henk 'm!

  • spine
  • Registratie: Juni 2001
  • Niet online

spine

VISHUDDHI

Anoniem: 104881 schreef op zaterdag 02 december 2006 @ 00:13:
[...]

Hoe zou ik dit aan moeten pakken dan? Ik geloof dat ik dit niet helemaal kan volgen. Zou je iets specifieker kunnen toelichten hoe dit in zijn werk gaat?
In play.php genereer je een code (vb. $strCode) en die sla je op in bijvoorbeeld een database.
Vervolgens roep je "video.php?code=$strCode&etc..." op deze manier aan. In video.php match je de code weer aan de opgeslagen waarde in je database en als die overeen komt verwijder je die code en kan je het filmpje laten zien.

Bij het opslaan zou je ook nog een timestamp en een ip kunnen toevoegen.

[BSDFreaks.nl] [www.Dark-Future.org] [Alizarin.nl]


Acties:
  • 0 Henk 'm!

Anoniem: 104881

Topicstarter
ah ok nu snap ik hem! lijkt me een goede oplossing, ga ik zeker gebruiken!

Ik zat al te denken dat als je die code meestuurt als variabele dat de bezoeker dit dan simpelweg kan herhalen, maar net zoals het terugzetten van die sessievariabele kun je natuurlijk ook gewoon die code er weer uit gooien zoals je aangeeft, bedankt in ieder geval!

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 16:58
Anoniem: 104881 schreef op zaterdag 02 december 2006 @ 00:13:
Dit is niet echt een optie omdat het om een streaming video bestand gaat dat nogal groot is. Het bestand staat op een server van een externe partij die alleen de streaming dienst verzorgt. Als ik het bestand ga renamen dan kunnen andere bezoekers het niet gelijktijdig bekijken en tijdelijke een kopie maken zou veel te langzaam gaan...
Ik gok dat bedoelt wordt het bestand dynamisch te rewriten. Hiervoor gebruik je mod_rewrite. Als je nu een databasetable maakt voor requests, en elke request bouw je dynamisch op, heb je het hele probleem ook opgelost.

In je database maak je een table met 3 kolommen: ID, url van de video, en status. Als iemand de video opvraagt stop je het url van de video in de database, je geeft het ID mee met een GET request en zodra het bestand wat die request afvangt opgeroepen wordt update je de status naar bekeken. Hiermee kun je ook iemand rechten geven een video 3x te bekijken bijvoorbeeld.

De oplettende lezer merkt nu natuurlijk op dat dit in feite niks anders is dan een handmatige sessie implementatie en is daarmee volledig correct. Het geeft je echter veel meer macht over wat de gebruiker doet en zorgt ervoor dat het -ook- gaat werken in browsers met sessie's uit. Niet dat die nog bestaan hopelijk, maar you never know. Daarnaast voorkom je dus dit soort vage problemen (die, ontopic, waarschijnlijk wel opgelost kunnen worden met output buffering)

Overigens, a word of warning: als je op deze manier je code implementeert heb je met een beetje pech binnen een dag een SQL injectie te pakken. Gooi er op z'n minst mysql_real_escape_string overheen, of beter nog, een simpele if_numeric ;)

//edit
offtopic:
Mmm, mezelf even schoppen voortaan wel netjes alle posts goed te lezen voor ik reageer, mijn verhaal wordt hierboven ookal min of meer vermeld :X

[ Voor 4% gewijzigd door FragFrog op 02-12-2006 23:44 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

Anoniem: 104881

Topicstarter
bedankt voor de aanvullende uitleg, mijn handmatige-sessie-implementatie werkt inmiddels correct. Wel heb ik er om één of andere reden nog een sleep(1) tussen moeten zetten, deze plaats ik voordat ik in video.php de code weer verwijder. Als ik dit niet doe dan werkt de oplossing niet in FF, waarom dit nu precies is kan ik niet verklaren...
Gooi er op z'n minst mysql_real_escape_string overheen, of beter nog, een simpele if_numeric
Waarom zou dit nodig zijn? Ik zie niet zo direct hoe ik met een MYSQL injectie te maken zou krijgen als de code die de controlecode in de db zet gewoon in play.php zit en de code altijd gelijk weer verwijderd wordt vanuit video.php (die altijd aangeroepen wordt als play.php geopend wordt)...

Acties:
  • 0 Henk 'm!

Anoniem: 104881

Topicstarter
mmm ik moet nog even een aanvulling op mijn vorige post doen. Ik heb zoals aangegeven de oplossing die spine en fragfrog me aan hebben geraden geimplementeerd. Deze werkt in IE perfect, zoals aangegeven moet ik in FF een sleep(1) opnemen voordat ik de code weer verwijder uit de db anders werkt het niet. Nu kijk ik echter in Opera en zie dat de oplossing niet werkt (ook niet met de sleep(1) er voor). Hier is het laatste gedeelte van video.php:
code:
1
2
3
4
echo $url;
sleep(1);
$Sql = "DELETE FROM access WHERE code = '" . $Code . "'";
mysql_query($Sql);


In dit stukje wordt de url weergegeven en vervolgens de code verwijderd zodat de url niet nog een keer kan worden opgevraagd door het adres dat onder eigenschappen>locatie in de media player staat in de adresbalk te kopieren. Als ik de onderste drie regels weglaat (en de code dus niet verwijder) dan werkt de oplossing ook in Opera, maar ja dan is de controle op die code dus weer weg |:(

Ik heb zelf het vermoeden dat de manier waarop Opera het media player element 'gebruikt' er voor zorgt dat het noodzakelijk is dat de media player die url nog een keer opvraagt via video.php. Als het script van video.php voor de tweede keer gedraaid wordt dan wordt er geen url meer weergegeven en daarom werkt het dan kennelijk niet???

Ik heb geprobeerd sleep(1) voor de test op te hogen naar sleep(10) maar ook dan krijg ik in Opera geen video te zien. Ik vind het erg vreemd dat het in IE gewoon werkt, ik in FF sleep(1) moet doen voor het verwijderen van de code en dat het in Opera helemaal niet werkt....

Iemand een verklaring/oplossing voor dit vreemde gedrag??

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 01:32

crisp

Devver

Pixelated

Anoniem: 104881 schreef op maandag 04 december 2006 @ 19:12:
Iemand een verklaring/oplossing voor dit vreemde gedrag??
Heb je al eens een HTTP sniffer mee laten draaien om te zien wat er precies allemaal voor requests gedaan worden en welke data daarbij meegestuurd (of niet) wordt?

Intentionally left blank

Pagina: 1