[PHP] header redirect vanuit frame

Pagina: 1
Acties:
  • 334 views sinds 30-01-2008
  • Reageer

Onderwerpen


Anoniem: 104881

Topicstarter
Voor een bepaalde website die nog in de testfase zit heb ik een bepaalde oplossing die betaalde toegang tot een website afhandelt. Dit werkt op zich goed, maar wanneer de gebruiker geen toegang meer heeft stuur ik deze momenteel naar een ander scherm met behulp van JS redirect. Dit is natuurlijk een beveiligingsrisico want als iemand tussentijds JS heeft uitgeschakeld werkt de redirect niet en houdt men toegang. Ik zou daarom de redirect graag met de Header functie doen, maar dit krijg ik niet voor elkaar.

Ik maak gebruik van de volgende pagina (check.php) het recht op toegang controleert (hier heb ik de header functie al in staan ipv de JS redirect):

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
29
30
31
32
33
34
35
36
37
38
39
<?php 
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header("Cache-Control: no-store, no-cache, must-revalidate"); 
header("Pragma: no-cache"); 

error_reporting(E_ALL);
$REMOTE_ADDR=$_SERVER[REMOTE_ADDR];
$htaccess_file   = '.htaccess';  // .htaccess file 
set_time_limit(0);

// Controleren of ip nog toegang heeft
function IPCheck($ip) {
    global $htaccess_file;
    
    if($htaccess_file=='') 
        return true;
        
    $ip_allowed= strtolower(join(' ',file($htaccess_file)));
    $ip_okay   = strpos($ip_allowed, "allow from $ip") ? 1:0;
    return $ip_okay;
}

//kijken of ip uberhaupt toegang heeft
$okay      =IPCheck($REMOTE_ADDR);

while($okay)
{
    if($htaccess_file && (time()!=$last_time))
    {
        //Elke seconde controleren
        $last_time=time();
        $okay=IPCheck($REMOTE_ADDR);
    }    
    if($okay == 0)
    {
        header("location: http://www.mijnpagina.nl/verbroken.php");
    }
}
?>


Deze pagina bevindt zich in het eerste frame van deze pagina:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html>
<head>
<title>Toegang tot alle films en foto's!</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<frameset rows="0,*"" frameborder="NO" border="0" framespacing="0">
  <frame src="check.php" name="top">
  <frame src="index2.htm" name="main">
</frameset>
</script>
<noframes><body>
</body></noframes>
</html>


In het tweede frame bevindt zich de pagina waarvan de toegang geblokkeerd wordt als check.php constateert dat er geen recht op toegang meer is. Zoals te zien is wordt er vanuit check.php geen output gestuurd. Als ik bovenstaande oplossing echter draai krijg ik zo gauw check.php de header functie laat uitvoeren toch de melding
Warning: Cannot modify header information - headers already sent by (output started at .../check.php:7)

Ik heb zelf het idee dat dit komt doordat check.php in een frame zit, en dat het frame op zich ook als output gezien wordt. Of heb ik dit verkeerd en is het toch mogelijk om binnen frames gebruik te maken van header (en wel zodanig dat de nieuwe pagina in het hele venster geladen wordt en dus niet binnen het frame waarin de header functie wordt aangeroepen)???

Bedankt!!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 26-05 11:23

MBV

Je denkt een beetje verkeerd. Als je een HTTP redir geeft, kan een gebruiker dat alsnog omzeilen door een deeplink te gebruiken (theoretisch). Als je hem dicht wilt timmeren, moet je gewoon na die Javascript niks meer uitvoeren. Voor de gebruikers zonder javascript geef je als 'service' een linkje "u wordt nu doorgestuurd naar ...".

  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 21:50

hamsteg

Species 5618

Eens met bovenstaand commentaar en verder stuur je al een bak aan data weg in andere header calls en volgens mij moet de "location" altijd als eerste header verzonden worden (en ook als enige want de rest heeft geen zin meer). Zie There are two special-case header calls ... .

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Je zou de check moeten inbouwen in index2.htm, dan alleen kan je voorkomen dat ie geopend wordt als je niet betalend bent.

Javascript met een check of je wel frames gebruikt heeft geen zin, zet javascript af, en je geraakt binnen.

Die error op lijn 7 komt doordat je
PHP:
7
$REMOTE_ADDR=$_SERVER[REMOTE_ADDR];
gebruikt maar van een ongequote index.
Dus gebruikt
PHP:
7
$REMOTE_ADDR=$_SERVER['REMOTE_ADDR'];


Dit lost je probleem wel niet op, maar wel je error.

Dus, zet je check in index2.htm

[ Voor 1% gewijzigd door Snake op 07-09-2006 17:07 . Reden: grommm ]

Going for adventure, lots of sun and a convertible! | GMT-8


Anoniem: 27270

Mijn eerste oplossing zou zijn, dump je check.php en voer de echte check uit in index2.htm

Een eventuele andere optie zou kunnen zijn:
  1. Laat check.php controleren, wanneer er toestemming is stel een cookie in en reload een deel van het frame, bijvoorbeeld: index.htm, met een stukje javascript
  2. Controleer in index2 en verwante pagina's of de cookie ingesteld en juist is

Acties:
  • 0 Henk 'm!

Anoniem: 104881

Topicstarter
Bedankt voor de reacties. Een header redirect is (krijg ik nu door) inderdaad denk ik toch niet de oplossing. Ik gebruik nu onderstaande code. De eerste drie header heb ik nodig om ervoor te zorgen dat Opera check.php niet cacht, anders gaat het fout wanneer de gebruiker de pagina de 2e keer bezoekt. De redirect werkt wel (kennelijk zijn de eerste drie header geen probleem), maar alleen het frame waarin check.php zich bevindt wordt vernieuwd met de nieuwe pagina, index2.htm blijf gewoon in zijn eigen frame staan. Elders las ik al dat het niet mogelijk is om met header ervoor te zorgen dat de nieuwe pagina in het hele browserscherm wordt geladen ipv alleen in het frame waarin de pagina staat die de header call doet, is dit ook zo? Kennelijk het probleem van server side scripting vs client side scripting?

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
29
30
31
32
33
34
35
36
37
38
39
<?php 
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header("Cache-Control: no-store, no-cache, must-revalidate"); 
header("Pragma: no-cache"); 
error_reporting(E_ALL);
$REMOTE_ADDR=$_SERVER["REMOTE_ADDR"];
$htaccess_file   = '.htaccess';  // .htaccess file 
set_time_limit(0);

// Controleren of ip nog toegang heeft
function IPCheck($ip) {
    global $htaccess_file;
    
    if($htaccess_file=='') 
        return true;
        
    $ip_allowed= strtolower(join(' ',file($htaccess_file)));
    $ip_okay   = strpos($ip_allowed, "allow from $ip") ? 1:0;
    return $ip_okay;
}

//kijken of ip uberhaupt toegang heeft
$okay      =IPCheck($REMOTE_ADDR);

$last_time = time();
while($okay)
{
    if($htaccess_file && (time()!=$last_time))
    {
        //Elke seconde controleren
        $last_time=time();
        $okay=IPCheck($REMOTE_ADDR);
    }    
    if($okay == 0)
    {
        header("location: http://www.mijnpagina.nl/verbroken.php");
    }
}
?>


Als ik dan toch maar met JS ga werken dan vraag ik me toch nog een aantal dingen af:
Als je hem dicht wilt timmeren, moet je gewoon na die Javascript niks meer uitvoeren.
Wat bedoel je hier precies mee, na de JS redirect komt in mijn geval toch sowieso geen output meer?
Voor de gebruikers zonder javascript geef je als 'service' een linkje "u wordt nu doorgestuurd naar ...".
Dit lijkt me toch onlogisch? Tenminste als JS niet aanstaat dan wordt je toch helemaal niet doorgestuurd?

Misschien heb ik niet duidelijk genoeg uitgelegd hoe mijn pagina gaat werken. In index2.htm wordt een film afgespeeld en tijdens het afspelen van de film moet gekeken worden of de bezoeker nog toegang heeft (vandaar dat een header redirect vanuit index2.htm niet mogelijk is). Dit wordt gedaan door in het htaccess bestand te kijken waarin het ip-adres van de bezoeker moet staan. Een extern betaalsysteem heeft toegang tot dit bestand en haalt het ip-adres van de bezoeker eruit wanneer deze geen toegang meer heeft. Op dat moment ziet de controle dus dat het ipadres niet meer in het bestand staat en moet dan de bezoeker redirecten.

In de situatie zoals ik die hierboven bechrijf lijkt het mij toch dat een JS redirect vanuit een ander frame van hetzelfde beveiligingsniveau is als een JS redirect vanuit index2.htm zelf? Het gaat immers in beide gevallen om een JS redirect. Index2.htm los openen terwijl er geen toegang is gaat sowieso niet, omdat dit in het htaccess bestand al geregeld is, het gaat dus puur om de conrole tijdens het afspelen van de film in index2.htm als deze pagina reeds geopend is. Dan is een controle vanuit een ander frame toch prima of mis ik hier iets??

Wat me de meeste zorgen baart is dat de JS redirect te omzeilen is (volgens mij). Tenminste als je tijdens het afspelen van de film JS afzet cq laat stoppen met het uitvoeren van JS op de pagina dan omzeil je toch de redirect?
Ik zou natuurlijk een extra redirect in de vorm van een meta refresh toe kunnen voegen, maar ook dit is af te zetten toch?

Dan lijkt het me dat ik met deze oplossing toch nog geen 100% beveiliging heb of overdrijf ik nu een beetje?

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 26-05 11:23

MBV

Zonder javascript kan je inderdaad niks meer voor zover ik weet. Dus als iemand de web developer toolbar heeft, en disable JS doet, dan is je check weg. Als iemand index2.htm bekijkt zónder frame (url intikken) ga je in deze situatie sowieso nat.
Javascript kan je niet vermijden (hoeveel % van de firefox gebruikers heeft dat ding? Hoeveel een IE-alternatief?), maar index2.htm kan je natuurlijk zelf wel laten checken of het nog mag: laat index2.htm met Ajax o.i.d. vragen aan de server of er nog mag worden afgespeeld, en de server kan dan reageren met ja of nee. Zonee: redirect.

De enige échte oplossing is flash o.i.d. gebruiken om de film af te spelen (zoals YouTube etc) en dat flash programma aan je PHP-script laten vragen of het nog mag, elke x seconden.

offtopic:
welke Pr0n-site ben jij de beveiliging voor aan het schrijven? :+

Acties:
  • 0 Henk 'm!

  • Tepel
  • Registratie: Juni 2006
  • Laatst online: 17-08-2024
Ik denk dat ik het snap, een gebruiker mag maar voor een beperkte tijd op een bepaald gedeelte komen. Ik snap alleen niet waarom je constant die controle uitvoert. Ten eerste is het erg nutteloos en ten tweede kost het de server alleen maar resources.
Ik neem aan dat de gebruikers nadat ze toegang hebben gekregen niet op die ene pagina blijven? Waarom voer je die controle niet gewoon uit bij elk request dat ze doen? Ten eerste ben je van die gare frameset af en ten tweede scheelt het de server een hoop resources. En wat dan nog als ze die ene pagina die ze als laatste bezocht hebben op hun scherm laten staan, lekker belangrijk (er vanuitgaande dat ze telkens web-requests doen en dus niet statisch naar 1 pagina lopen te kijken.
Eventueel kan voor gebruikersgemak ergens nog een javascript controle doen die elke 5 secs een frame/iframe reload om de controle uit te voeren, dat moet je dus zien als een extra service.

Maar mijn verhaal is dus alleen nuttig als het beveiligde gedeelte meer is dat 1 pagina waarnaar je dus eenmaal een request naar maakt.

-- edit
Ik zie dat je een film af speelt, de enige andere optie die ik kan bedenken is je film te streamen dmv een php bestand die zelf de controle uitvoert. Geen toegang stream stopzetten etc etc
Enige probleem is dat je dus moet bepalen hoeveel data nodig is om de stream fatsoenlijk af te laten spelen. Aangezien je niet te weinig data mag versturen maar ook niet alles in 1x aangezien je dan de stream niet meer kan beheren. Ben geen expert in multimedia op sites maar ik zou zeggen dat dit ook nog een optie is. Je zal wel moeten streamen anders kunnen ze gewoon de locatie van de film achterhalen en gewoon downloaden.

[ Voor 22% gewijzigd door Tepel op 08-09-2006 15:48 ]

0x7F


Acties:
  • 0 Henk 'm!

  • moozzuzz
  • Registratie: Januari 2005
  • Niet online
Tepel schreef op vrijdag 08 september 2006 @ 15:42:
Je zal wel moeten streamen anders kunnen ze gewoon de locatie van de film achterhalen en gewoon downloaden.
Het systeem van rapidshare kan ook handig zijn om te overwegen:
  • friendly urls om binnen te raken
  • very-unfriendly urls voor bestanden (die naar ik vermoed ook gestreamed worden)
Als het mogelijk is dat een gebruiker tijdens het filmpje-kijken kan onderbroken worden (ik kan me bij die mogelijkheid somehow enkel een 3x-filmtoepassing voorstellen), zal de stream periodiek laten checken, de enigste veilige oplossing zijn.

Acties:
  • 0 Henk 'm!

Anoniem: 104881

Topicstarter
wederom bedankt!

ik heb het systeem van rapidshare bekeken, maar dit is voor mij niet echt geschikt. Ik denk dat ik inderdaad (zoals Tepel voorstelt) het beste kan gaan streamen. Wel vraag ik me af hoe dit precies moet gebeuren.

Ik weet namelijk hoe ik een videobestand kan streamen mbv php, zodat ik controle heb over het aantal KB/s dat maximaal per seconde verstuurd wordt en waarbij ik dan tussentijds check of er nog recht is op toegang. Bij deze manier van werken wordt er echter een bestand verstuurd naar de bezoeker wat dan vervolgens geopend kan worden met een media player of een adere video player.

Ik zou echter graag streamen, maar dan wel het video-bestand in een embedded media player object
direct op de website laten afspelen. Ik zie echter niet in hoe ik dit voor elkaar moet krijgen. Ik heb wat gegoogled. Op deze site:
http://www.mediacollege.c...export/windows-media.html

heb ik wat gelezen over hoe je met allerlei prog's zogenaamde 'streaming video files' kan maken. Hierbij maak je echter een bestand dat je vervolgens wel in een embedded media player object kunt laten afspelen, maar dan heb je toch net zo goed nog de mogelijkheid om dan ook het hele bestand te gaan downloaden omdat je de locatie kunt achterhalen!?

Ik zoek dus een manier om via php een bestand te streamen, zodat het niet los te downloaden is en wel direct in een embedded mp object in de website wordt afgespeeld.

Waar ik uiteraard rekening mee wil houden is verschillende verbindingssnelheden, omdat ik geen gebruik wil gaan maken van een streaming server lijkt het mij logisch dat ik dan verschillende bestanden moet aanmaken van een film, elk geschikt voor een bepaalde verbindingssnelheid.

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Anoniem: 104881 schreef op maandag 11 september 2006 @ 19:45:
wederom bedankt!

... Ik denk dat ik inderdaad (zoals Tepel voorstelt) het beste kan gaan streamen. Wel vraag ik me af hoe dit precies moet gebeuren.

Ik weet namelijk hoe ik een videobestand kan streamen mbv php, zodat ik controle heb over het aantal KB/s dat maximaal per seconde verstuurd wordt en waarbij ik dan tussentijds check of er nog recht is op toegang. Bij deze manier van werken wordt er echter een bestand verstuurd naar de bezoeker wat dan vervolgens geopend kan worden met een media player of een adere video player.

Ik zou echter graag streamen, maar dan wel het video-bestand in een embedded media player object
direct op de website laten afspelen.

Ik zoek dus een manier om via php een bestand te streamen, zodat het niet los te downloaden is en wel direct in een embedded mp object in de website wordt afgespeeld.

...
omdat ik geen gebruik wil gaan maken van een streaming server lijkt het mij logisch dat ik dan verschillende bestanden moet aanmaken van een film, elk geschikt voor een bepaalde verbindingssnelheid.
Je wil wel streamen maar geen streaming server neerzetten???

Maar voor wat jij wilt moet je gewoon eens kijken naar een flash-videoplayer ( zoals googlevideo / youtube ). Dan bouw je een 3-lagen systeem.
Klant bekijkt flash-videoplayer
Flash videoplayer haalt filmpje op via php / asp / ander script
php / asp / ander script haalt het bestand op van schijf en controleert ook of de klant het mag bekijken.

Op deze manier als de klant het niet mag gebruiken komt er ook echt niks bij de klant terecht. Want alles stopt bij de flash videoplayer, deze krijgt gewoon geen data meer.

Acties:
  • 0 Henk 'm!

Anoniem: 104881

Topicstarter
bedankt, ik zal eens serieus naar een oplossing met flash video player kijken.

Maar:
Je wil wel streamen maar geen streaming server neerzetten???
moet ik hieruit afleiden dat dit helemaal niet kan? Tenminste wat ik bedoelde is dat ik geen server wil neerzetten speciaal alleen voor het streamen of praat ik nu onzin?

En wat ik eerder vroeg: of het mogelijk is om een video-bestand te streamen en af te laten spelen in windows media speler? Lijkt mij dat zoiets toch moet kunnen maar hoe?
Is het niet mogelijk om wanneer de bezoeker een bepaalde video opvraagt, via php automatisch op de server een streambestand te creeren dat gekoppelde wordt aan een bepaalde bezoeker (en dus niet zomaar opvraagbaar is, alleen door die specifieke bezoeker zolang deze recht op toegang heeft) en dat dan afspelen in een embedded media player object?

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Anoniem: 104881 schreef op maandag 11 september 2006 @ 22:15:
bedankt, ik zal eens serieus naar een oplossing met flash video player kijken.

Maar:

[...]


moet ik hieruit afleiden dat dit helemaal niet kan? Tenminste wat ik bedoelde is dat ik geen server wil neerzetten speciaal alleen voor het streamen of praat ik nu onzin?
Het kan zonder extra server, maar ik weet niet hoeveel bezoekers je verwacht. Streamen is vrij cpu intensief
En wat ik eerder vroeg: of het mogelijk is om een video-bestand te streamen en af te laten spelen in windows media speler? Lijkt mij dat zoiets toch moet kunnen maar hoe?
Is het niet mogelijk om wanneer de bezoeker een bepaalde video opvraagt, via php automatisch op de server een streambestand te creeren dat gekoppelde wordt aan een bepaalde bezoeker (en dus niet zomaar opvraagbaar is, alleen door die specifieke bezoeker zolang deze recht op toegang heeft) en dat dan afspelen in een embedded media player object?
Waarom een stream bestand creeeren.
Zorg ervoor dat je data via een php-script gestreamd wordt ( hier check je of iemand het mag of niet ) Dan heb je maar 1 bestand, dit is niet vanaf buiten aan te roepen. Maar alleen via stream.php?code=0101010101010 waarbij je alleen data verstuurt als de code klopt. Klopt de code niet, dan geeft je php-script gewoon geen data meer. Let er alleen wel op dat je ook moet controleren hoe snel je bits uitgeeft. Want als ik met een gigabit internet verbinding het complete bestand binnen 2 sec in mijn lokale buffer heb staan dan kan jouw php-script best de verbinding dichtknijpen, maar lokaal heb ik het toch wel staan.

Dus gewoon een php-script ertussen wat gewoon de data-bits verstuurd in een goed tempo ( te langzaam betekent dat de klant storing krijgt, te snel betekent dat de klant gaat bufferen en buffers zijn op te slaan ).
Enige nadeel hieraan is dat ik gewoon de stream kan opslaan door gewoon een beetje kunstig met urls te spelen ( gewoon ipv media player mijn lokale pc zo instellen dat een ander programma het opslaat ) Dit is wel weer te verhelpen met drm of een ander implementatie hiervan. Maar via media player moet je of dure software van MS kopen die het versleutelt ( zodat als iemand het lokaal opslaat hij er niks mee kan doen ) of je moet accepteren dat er altijd mensen zullen zijn die je streams kunnen jatten ( met een beetje goed php-script wat de snelheid controleert krijg je wel dat als iemand een film van 2 uur wil jatten dat hij ook echt 2 uur aan het downloaden is :) )

Of ga gewoon voor een flashplayer ( is heel wat moeilijker te kraken ) Of kijk eens wat MS voor software te bieden heeft, kijk gewoon eens naar windows media encoder ofzo.

Acties:
  • 0 Henk 'm!

Anoniem: 104881

Topicstarter
Nogmaals bedankt, voor de heldere uitleg! Ik ga inderdaad eens kijken wat ik allemaal met windows media encoder kan.
Het kan zonder extra server, maar ik weet niet hoeveel bezoekers je verwacht. Streamen is vrij cpu intensief
Ah ok, dan kan ik precies doen wat ik in gedachten had, gewoon aanvankelijk zonder server werken en bij meer bezoekers een extra server plaatsen.

Op zich is het overigens niet zo erg als men uiteindelijk het bestand naar de lokale pc kan halen door
met urls te spelen
. Zolang de bezoeker inderdaad bijna net zolang moet wachten voordat de film binnen is als dat deze duurt dan is dit geen probleem.

Wat me nog niet helemaal duidelijk is is hoe ik het nu voor elkaar krijg om mijn gestreamde data direct op mijn website af te spelen. Ik wil dus graag dat de film op mijn website in een embedded mp object wordt afgespeeld. Hoe kan ik het voor elkaar krijgen om de gestreamde data naar het embedded object op de website te sturen, zodat deze het afspeelt?

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Anoniem: 104881 schreef op dinsdag 12 september 2006 @ 08:17:

Wat me nog niet helemaal duidelijk is is hoe ik het nu voor elkaar krijg om mijn gestreamde data direct op mijn website af te spelen. Ik wil dus graag dat de film op mijn website in een embedded mp object wordt afgespeeld. Hoe kan ik het voor elkaar krijgen om de gestreamde data naar het embedded object op de website te sturen, zodat deze het afspeelt?
Simpelste oplossing : Kijk eens naar de source van een website die dit heeft en pas dit aan.

Moeilijke oplossing : Zoek eens naar de html tag <embed>. Heb zo snel geen link voor je.

  • denyos
  • Registratie: Februari 2004
  • Laatst online: 21:24
je zoekt zo iets?

code:
1
2
3
4
5
6
7
8
9
10
 <object id="MediaPlayer1" CLASSID="CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95" codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701"
standby="Loading Microsoft Windows® Media Player components..." type="application/x-oleobject" width="280" height="256">
<param name="fileName" value="<%=preview%>">
<param name="animationatStart" value="true">
<param name="transparentatStart" value="true">
<param name="autoStart" value="true">
<param name="showControls" value="true">
<param name="Volume" value="-300">
<embed type="application/x-oleobject" pluginspage="http://www.microsoft.com/Windows/MediaPlayer/" src="<%=preview%>" name="MediaPlayer1" width=280 height=256 autostart=1 showcontrols=1 volume=-300>
</object>


src zal je ffies moeten aanpassen...heb dit eventjes uit een websiteje gehaald dat ik 2 jaar terug heb gebouwd....

Strava


Anoniem: 104881

Topicstarter
bedankt, het embedden van een windows media player element en het afspelen van films daarin lukt me op zich wel. Waar het me omgaat is hoe ik het bestand dat ik via een php script laat streamen daarin tijdens het streamen al kan laten afspelen. Misschien handig als ik mijn code even geef. Dit script gebruik ik om te streamen.

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
<?php 
// Video Streaming with IP check
// 
// Checks if $REMOTE_ADDR is still in the .htaccess file
// if not, stops streaming video
//
// Parameters:
//   $speed = speed of stream in Kbits (ie 64 = 64KBit)
//   $wmv   = name of file to stream
//
// (C)(LH)2003 DialXS BV 
//

// make 'm local
$DEBUG=$_GET[DEBUG];
$wmv  =$_GET[wmv];
$speed=$_GET[speed];

$REMOTE_ADDR=$_SERVER[REMOTE_ADDR];

// GLOBALS
$htaccess_file   = '.htaccess';  // Path to .htaccess file to check (if empty, the stream is never stopped!)
$path_prefix     = 'video/';              // Path prefix for video files (MUST INCLUDE '/' AT THE END!!!)

if($DEBUG==99) phpinfo();

set_time_limit(0);
ob_implicit_flush(1);
ob_end_flush();

// Output without buffering
function p($msg) {
}

function flushit() {
// Flush buggy PHP versions too
    flush();
    ob_flush();
}

// Return time with microtime
function t() {
    $t=time()+doubleval(microtime());
    return $t;
}

// Check if IP still has access
function IPCheck($ip) {
    global $htaccess_file, $DEBUG;
    
    if($htaccess_file=='') 
        return true;
        
    $ip_allowed= strtolower(join(' ',file($htaccess_file)));
    $ip_okay   = strpos($ip_allowed, "allow from $ip") ? 1:0;
    if($DEBUG && !$ip_okay) print "$ip not in .htaccess($ip_allowed) !<br>\n";
    return $ip_okay;
}

$mime_type_array = array(     // Content types
    '.asf' => 'application/vnd.ms-asf', 
    '.avi' => 'video/x-msvideo', 
    '.mov' => 'video/quicktime', 
    '.mpe' => 'video/mpeg', 
    '.mpeg' => 'video/mpeg', 
    '.mpg' => 'video/mpeg', 
    '.ra' => 'audio/x-pn-realaudio', 
    '.ram' => 'audio/x-pn-realaudio', 
    '.rm' => 'audio/x-pn-realaudio', 
    '.wmv' => 'video/x-ms-wmv' 
    ); 


// Operational variables
$IOBUFSIZE   = 8192;      // Packet size
$total_bytes_send= 0;         // Progress counter
$margin          = 0.90;          // 10% overhead for streaming

if(!$speed) $speed=500; // Default to 500K streams

$max_bytes_per_second = round($speed*1000/8);

$mime_type = strtolower(strrchr($wmv,'.')); 
if(!$content_type=$mime_type_array[$mime_type])
    $content_type='application/octet-stream';
    
$length   =filesize($path_prefix.$wmv);
if($length==0 || !$wmv || !$h=fopen($path_prefix.$wmv,"r")) {
    die("Invalid file [$path_prefix$wmv]");
}

if($DEBUG) {
    print "<PRE>File $wmv ($content_type): $length bytes.\nmax_bytes_per_second=$max_bytes_per_second\n";
} else {
    header("Cache-Control: None");
    header("Pragma: no-cache");
    header("Accept-Ranges: bytes");
    header("Content-Type: $content_type");
    header("Content-Length: $length");
    header("Keep-Alive: timeout=2, max=50");
    header("Connection: Keep-Alive");
    header("Content-Transfer-Encoding: binary");
}

$start_time=t();
$okay      =IPCheck($REMOTE_ADDR);

while($okay) 
{
    if (($length > 0) && (($total_bytes_send + $IOBUFSIZE) > $length))
        $len = $length - $total_bytes_send;
    else
        $len = $IOBUFSIZE;

    $buf = fread($h, $len);
    $n   = strlen($buf);

    if($n==0)
    {
        $okay = 0;
    }
    elseif($htaccess_file && (time()!=$last_time))
    {
        // Check every second
        $last_time=time();
        $okay=IPCheck($REMOTE_ADDR);
    }    
    if($okay)
    {
        if($DEBUG) {
            if($i++ % 100==0) echo "\n";
            echo ".";
        } else {
            echo $buf;
        }
        flushit();
        
        $total_bytes_send+=$n;

        $time_elapsed = t()-$start_time;
        $max_bytes    = $max_bytes_per_second*$time_elapsed;
        
        if($total_bytes_send > $max_bytes)
        {
            // Slow us down!
            $delay_time=(($total_bytes_send/$max_bytes_per_second)-$time_elapsed)*1000000*$margin;

            if($delay_time>0 && $delay_time<60000000) {
                usleep($delay_time);
            }
        }
    }
}

fclose($h);
?>


Dit bestand roep ik als volgt aan:
streamer.php?wmv=movie.wmv

Het script werkt prima, als ik bovenstaande aanroep direct in de browser doe dan kan ik het bestand opslaan op mijn harde schijf en wordt het vervolgens met de opgegeven max. snelheid verzonden.

Nu probeer ik echter het volgende binnen een media player object (de rest van de code laat ik even weg):
<param name="FileName" value="streamer.php?wmv=movie.wmv" />
en:
src = "streamer.php?wmv=movie.wmv"

Dit werkt echter niet. Nu vraag ik me af of een opzet zoals ik deze heb gemaakt wel uberhaupt kan werken of dat ik het heel anders aan moet pakken.

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 26-05 11:23

MBV

Volgens mij moest je dat soort streams volgens een speciaal protocol streamen, en niet als 'gewoon' bestand (ivm dingen die je voor het eerste frame nodig hebt etc). Maar een expert ben ik niet op dat gebied.

Acties:
  • 0 Henk 'm!

Anoniem: 104881

Topicstarter
mmm ok bedankt, probleem is alleen dat ik na zoeken op Google nog niet in staat ben te achterhalen hoe (volgens welk protocol) ik de film zou moeten streamen. Iemand die weet hoe ik dit aan moet pakken?

Acties:
  • 0 Henk 'm!

Anoniem: 210589

Hallo flbos, ben je hier nog uitgekomen?
Ik zit namelijk met het zelfde probleem en zoek een passende oplossing hierin.
Hopelijk kan jij me na jou ervaring wel verder helpen.
Mike

Acties:
  • 0 Henk 'm!

Anoniem: 174951

edit:

Damn... had niet gezien dat het een kick was :(

[ Voor 89% gewijzigd door Anoniem: 174951 op 28-02-2007 09:49 ]

Pagina: 1