Tijdelijke link voor downloaden van bestanden

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Tim DK

Tim DK

28/09/2015 16:41:36
Quote Anchor link
Doormiddel van uniqid() gekoppeld aan een locatie van het bestand, en deze in een database op te slaan is het mogelijk om een tijdelijk link te maken, waardoor de gebruiker het bestand kan downloaden.

Echter in de Headers van Firebug is de exacte locatie nog altijd terug te vinden.

Uiteraard kan ik via mod_rewrite dit nog (deels) aanpassen. Maar het gaat om vele bestanden
waarvan ik wil dat ze voor 1 keer of een bepaalde tijd toegankelijk zijn zonder dat de exacte locatie
kan worden achterhaald. Voor iedere locatie een mod_rewrite (tijdelijk) aanmaken lijkt mij geen optie.

Iemand een idee hoe dit wel te bewerkstelligen, zonder in te loggen?
 
PHP hulp

PHP hulp

23/04/2024 19:27:59
 
Marthijn Buijs

Marthijn Buijs

28/09/2015 16:50:23
Quote Anchor link
Hoezo zonder mod_rewrite? Je kan het al voor elkaar krijgen met een paar regels code.
 
Tim DK

Tim DK

28/09/2015 17:03:08
Quote Anchor link
PHP Maarten op 28/09/2015 16:50:23:
Hoezo zonder mod_rewrite? Je kan het al voor elkaar krijgen met een paar regels code.


Ik heb, in dit geval m.b.v. mysql, de uniqid + link opgeslagen.
Maar dat laat niet overlet dat de Header nog steeds de exacte locatie weergeeft.
Ik ga ervan uit dat het ook dmv. een SESSION kan. De werkwijze is dan hetzelfde.
Maar dat blijf ik nog steeds met de Header stoeien.

Wat is jou aanpak in deze?
 
Thomas van den Heuvel

Thomas van den Heuvel

28/09/2015 17:24:14
Quote Anchor link
Quote:
Voor iedere locatie een mod_rewrite (tijdelijk) aanmaken lijkt mij geen optie.


Uhm, 1 RewriteRule hiervoor is genoeg? Iets van de vorm /download/<code> --> /downloadscript.php?code=<code>

(of zonder rule, rechtstreeks via dit script)

Voordat je de download aanbiedt controleer je in dit script of deze code nog geldig is (nog niet is gedownload of meerdere keren gedownload mag worden voor een bepaalde datum).
Gewijzigd op 28/09/2015 17:25:33 door Thomas van den Heuvel
 
Tim DK

Tim DK

28/09/2015 17:40:47
Quote Anchor link
Thomas van den Heuvel op 28/09/2015 17:24:14:
Uhm, 1 RewriteRule hiervoor is genoeg? Iets van de vorm /download/<code> --> /downloadscript.php?code=<code>


Dan laat de Header nog steeds de exacte locatie zien:

//1.local/download/3102/file1.exe


Toevoeging op 28/09/2015 18:01:46:

Ter info:

Ik gebruik dit in mijn .htaccess
RewriteRule ^download/(.*)$ _link.php?tid=$1 [L]

En als ik Firebug in mijn browser open en de download/ url laad
dan staat onder Net -> Headers -> Location:
niet download* of _link.php*
maar de exacte locatie...

Zie ik iets over het hoofd?
Gewijzigd op 28/09/2015 17:42:17 door Tim DK
 
Ben van Velzen

Ben van Velzen

28/09/2015 19:11:29
Quote Anchor link
Je hoeft niet te redirecten, je kan ook direct de inhoud van het bestand doorsturen.
 
Tim DK

Tim DK

28/09/2015 20:07:18
Quote Anchor link
Ben van Velzen op 28/09/2015 19:11:29:
Je hoeft niet te redirecten, je kan ook direct de inhoud van het bestand doorsturen.


Het gaat hier om audio files die in bijv. <audio> afgespeeld moeten kunnen worden.
Via file_contents... (ik neem aan dat dát is wat je bedoelt) geeft dan weer problemen
met het afspelen, bijvoorbeeld vooruit spoelen. Een audio bestand kan dan alleen van af het begin beginnen, en andere controls (bijv. de tijdsduur) werken dan ook niet.

Het enige wat ik nog kan bedenken is een chmod 0600 <-> 0000
 
- Ariën  -
Beheerder

- Ariën -

28/09/2015 20:19:02
Quote Anchor link
Je kan de echte bestanden toch buiten je webroot opslaan? Dan kan niemand er direct bij.
Met een toegangcontrole en daarna een readfile() met de juiste headers kan je anderen deze weer laten downloaden.
 
Ben van Velzen

Ben van Velzen

28/09/2015 22:28:06
Quote Anchor link
Precies. En daar doel ik op, je hoeft niet te redirecten, je hoeft alleen de inhoud van het bestand door te geven, uiteraard met de juiste headers.
 
Tim DK

Tim DK

29/09/2015 11:55:36
Quote Anchor link
@Aar en @Ben
Uiteraard buiten de webroot is een optie. Maar de html5 <audio> tag werkt dan niet meer naar behoren:
- Geen tijdsindicatie
- begint hij direct met afspelen (autoplay)
- kan je alleen vooraan beginnen
- geen scroll forward/backward

Als jullie daar een antwoordt op hebben...
 
- Ariën  -
Beheerder

- Ariën -

29/09/2015 13:01:16
Quote Anchor link
Je moet die audio dan ophalen via readfile(). Echter de player kan je pas tonen als iemand gerechtigd is om die audio te mogen downloaden.
 
Tim DK

Tim DK

29/09/2015 14:29:22
Quote Anchor link
- Aar - op 29/09/2015 13:01:16:
Je moet die audio dan ophalen via readfile(). Echter de player kan je pas tonen als iemand gerechtigd is om die audio te mogen downloaden.


rechten: 0600 + apache (_www) is voldoende

pagina: audio.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
$file = "/home/non_public/mp3/test.mp3";

    header('Content-type: audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3');
    header('Content-Disposition: filename=test.mp3');
    header('Cache-Control: no-cache');
    readfile($file);


Moet er wel bij vermelden dat de pagina (audio.php) word ingeladen dmv.:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
$.ajax({
  type: 'POST',
url:"audio.php",


Echter, in dit geval wordt de source van het bestand weergegeven... :/
Als ik de pagina direct open dan wordt het bestand wel afgespeeld.
 
- Ariën  -
Beheerder

- Ariën -

29/09/2015 14:46:36
Quote Anchor link
Als je PHP-source ziet, dan mis je de PHP-tags of gebruik je de verouderde short-tags?
Wat zie je nu eigenlijk precies?
 
Tim DK

Tim DK

29/09/2015 14:59:37
Quote Anchor link
- Aar - op 29/09/2015 14:46:36:
Als je PHP-source ziet, dan mis je de PHP-tags of gebruik je de verouderde short-tags?
Wat zie je nu eigenlijk precies?


De source van de mp3.
Zo iets als dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
????h???'?? 1c??PV:??L???pN ??5y?N??M???c?bX "X?@??|K??? @??9<??00?,K3?~?...-knip-

Dus hij laat de mp3 wel maar (ik vermoed) omdat hij door de functie wordt gehaald
er een probeem onstaat met de header. Dat kan niet anders.
 
- Ariën  -
Beheerder

- Ariën -

29/09/2015 15:04:27
Quote Anchor link
En als je expliciet de header voor MP3 alleen gebruikt?

header('Content-Type: audio/mpeg');
 
Tim DK

Tim DK

29/09/2015 15:09:13
Quote Anchor link
- Aar - op 29/09/2015 15:04:27:
En als je expliciet de header voor MP3 alleen gebruikt?

header('Content-Type: audio/mpeg');


Alleen voor mp3 idd..
Met alleen audio/mpeg ook geprobeerd met hetzelfde resultaat, binary source output.
 
- Ariën  -
Beheerder

- Ariën -

29/09/2015 15:14:53
Quote Anchor link
Dan worden er vreemde headers gebruikt...
Controleer de MP3-file eens via: http://web-sniffer.net/
 
Tim DK

Tim DK

29/09/2015 15:32:00
Quote Anchor link
- Aar - op 29/09/2015 15:14:53:
Dan worden er vreemde headers gebruikt...
Controleer de MP3-file eens via: http://web-sniffer.net/


Test mp3 is van https://archive.org/download/testmp3testfile/mpthreetest.mp3

GET /download/testmp3testfile/mpthreetest.mp3 HTTP/1.1[CRLF]
Host: archive.org[CRLF]
Connection: close[CRLF]
User-Agent: Web-sniffer/1.1.0 (+http://web-sniffer.net/)[CRLF]
Accept-Encoding: gzip[CRLF]
Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7[CRLF]
Cache-Control: no-cache[CRLF]
Accept-Language: de,en;q=0.7,en-us;q=0.3[CRLF]
Referer: http://web-sniffer.net/[CRLF]
[CRLF]

Ik heb nog een andere geprobeerd (just in case) maar met wederom hetzelfde resultaat.
 
- Ariën  -
Beheerder

- Ariën -

29/09/2015 15:40:17
Quote Anchor link
Die URL is zelf al een 302 header, waarbij je de location-header moet volgen.
Kijk zelf maar op web-sniffer:

Quote:
Status: HTTP/1.1 302 Moved Temporarily
Server: nginx/1.4.6 (Ubuntu)
Date: Tue, 29 Sep 2015 13:38:06 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: close
X-Powered-By: PHP/5.5.9-1ubuntu4.11
Access-Control-Allow-Origin: *
Accept-Ranges: bytes
Location: https://ia802508.us.archive.org/5/items/testmp3testfile/mpthreetest.mp3


Het volgen kan met cURL, met het gebruik van de CURLOPT_FOLLOWLOCATION (true) parameter.
Gewijzigd op 29/09/2015 15:42:25 door - Ariën -
 
Tim DK

Tim DK

29/09/2015 15:47:14
Quote Anchor link
- Aar - op 29/09/2015 15:40:17:
Die URL is zelf al een 302 header, waarbij je de location-header moet volgen.
Kijk zelf maar op web-sniffer:
Het volgen kan met cURL, met het gebruik van de CURLOPT_FOLLOWLOCATION (true) parameter.


Ik weet niet precies wat je bedoelt maar die mp3test.mp3 heb ik gedownload en op mijn server gezet. Immers is het doel de mp3 af te spelen in de webpagina waarbij het bestand buiten de webroot staat.
 
- Ariën  -
Beheerder

- Ariën -

29/09/2015 15:53:49
Quote Anchor link
Die mp3 wordt aangeroepen door een PHP-script. Dus laat die PHP-file eens door web-sniffer 'sniffen'?
Deze moet de headers tonen die de MP3-file ook daadwerkelijk heeft. Dus beiden moeten gelijk zijn.
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.