Jump to content
Sign in to follow this  
xaltaz

Empêcher l'accès direct aux vidéos

Rate this topic

Recommended Posts

Bonjour,

J'utilise le lecteur JWplayer pour lire mes vidéos stockées sur mon propre serveur.

Mais en ouvrant le code source, l'utilisateur peut voir le lien direct de la vidéo et télécharger ou partager sur le net...

En faisant quelques recherches sur le net, j'ai trouvé un tutorial permettant de créer un token et de faire un RewriteRule ce qui va permettre donc à seulement apache de lancer les vidéos. En ensuite de faire un deny from all, allow 127.0.0.1 dans le dossier contenant les vidéos.

Pour l'instant tout marche nikel sauf un problème très génant, on ne peut plus faire avancer la vidéo. On arrive à faire bouger la barre de défilement, quand on pointe vers une zone non téléchargé, la vidéo se relance...

Je pense que le http pseudo streaming ne fonctionne plus en utilisant cette méthode puisque le token généré ne prend pas en compte le ?start=..

Je sais qu'on peut rien faire pour éviter la copie de la vidéo, mais moi je veux sauver ma bande passante.

Share this post


Link to post
Share on other sites

Si tu nous donnais un peu plus de précisions sur le système utilisé (je suppose qu'il y a un script qui "sert" la vidéo après avoir vérifié le token), ça pourrait aider... Il doit suffire d'ajouter la gestion du paramètre dans le script en question, et le problème serait réglé, ça doit être deux lignes de code à changer, en gros, mais il faut avoir le code en question pour le faire...

Jacques.

Share this post


Link to post
Share on other sites

J'utilise Ubuntu 11.10.

Et voilà le lien du tutorial du système de token que j'utilise : ici

Je suis disponible pour d'autres informations.

Edited by xaltaz

Share this post


Link to post
Share on other sites

Ben il faut remplacer le readfile qui envoie forcément tout le fichier par une séquence fopen, fseek, fpassthru. Le fseek doit utiliser la valeur éventuelle du paramètre de début (0 sinon), et voilà.

Quelque chose du genre:


$fp = fopen($fichier,"rb");
if (isset($_GET['start']))
{
fseek($fp,$_GET['start']);
}
fpassthru($fp);

Il faut aussi rajouter un flag QSA à ta RewriteRule.

Jacques.

Share this post


Link to post
Share on other sites

Bonjour Jacques,

Merci pour le script. Cependant je suis un peu nul avec le .htaccess voilà ce que j'ai écrit :

RewriteRule ^([a-zA-Z0-9]{40})\.mp4$ get.php?token=$1&start=$2 [L]

Mais c'est effectivement faux... petite aide? :)

Share this post


Link to post
Share on other sites

Pas besoin de rajouter explicitement le paramètre, il devrait suffire de rajouter le flag QSA (i.e. [L,QSA] au lieu de [L]). Comme ça, s'il y a start, il le garde (en plus du token), sinon, il ne le met pas.

Jacques.

Share this post


Link to post
Share on other sites

Bon j'ai mis.

La vidéo se lance, mais quand j'avance j'ai une erreur de video not found... :/

Edited by xaltaz

Share this post


Link to post
Share on other sites

Ahhh je viens de réaliser un truc... Le token n'est valable qu'une seule fois, donc forcément par la suite ça ne marche pas. D'ailleurs je suis surpris que ça fonctionnait (même en repartant au début) avant.

Ca complique un peu, il faut changer (un peu) la logique pour que que le token reste valable mais expire au bout d'un moment. Ca implique d'ajouter une colonne dans la table SQL (création ou expiration du token), puis de vérifier ça quand tu le récupères (et ne pas effacer le token -- il faudra par exemple probablement faire du ménage dans la table de temps en temps).

Jacques.

Share this post


Link to post
Share on other sites

J'ai supprimé la ligne qui permet de supprimer le token afin que le token reste valable mais le problème persiste.

Share this post


Link to post
Share on other sites

Tu as accès aux logs? Si oui, que disent-ils à ce moment là (access et error)? Quelle est l'erreur exacte que tu obtiens?

Jacques.

Share this post


Link to post
Share on other sites

Voilà l'erreur :

127.0.0.1 - - [16/Apr/2012:15:06:02 +0100] "GET /v/95c1718a6a67d3dd23bd35a37249fc4d041cd9f4.mp4 HTTP/1.1" 200 15139084 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:11.0) Gecko/20100101 Firefox/11.0"

127.0.0.1 - - [16/Apr/2012:15:06:02 +0100] "GET /v/95c1718a6a67d3dd23bd35a37249fc4d041cd9f4.mp4?start=277.05 HTTP/1.1" 200 10961164 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:11.0) Gecko/20100101 Firefox/11.0"

J'espère que c'est ce que tu cherches.

Share this post


Link to post
Share on other sites

Les logs montrent qu'il envoie bien quelque chose, mais...

1. Le start n'est visiblement pas comme je le pensais juste un offset en octets

2. En regardant dans le source d'un module qui gère ça, il semblerait qu'il faille reconstituer un header MP4 au début du fichier

Bref, pas si évident que ça, mais je me dis que ça ne devait pas plus marcher sans le système de token et tout ça, si? Si ça marchait, ça veut dire que tu as un module qui gère ça qui est installé, et la solution c'est probablement que le script php, au lieu de balancer le fichier directement, fasse un redirect interne vers l'URL d'origine (comme c'est interne ce ne serait pas visible de l'extérieur), mais ça commence à devenir un peu compliqué.

Jacques.

Share this post


Link to post
Share on other sites

Si si, sans le système de token tout marche nikel mais le script n'est pas protégé contre le hotlinking...

C'est justement pour cela que j'arrête pas de chercher et c'est la solution du token c'est la seule solution qui puisse correspondre à mes attentes

Share this post


Link to post
Share on other sites

Donc ça veut dire que tu as un module genre mod_h264_streaming installé qui gère ça, et comme je le disais, il faut alors soit reproduire ce qu'il fait (ce qui est assez complexe, il faut aller lire plein de trucs dans le mp4), soit renvoyer vers lui, mais c'est a priori non trivial en php. Si tu utilises mod_php, tu devrais pouvoir utiliser virtual($fichier); à la place du readfile original. Sinon, c'est plus tordu, il faut probablement faire appel à un RewriteMap et modifier le script pour qu'il agisse comme un filtre qui lit les URLs avec token et répond les URLs des fichiers. Normalement un RewriteMap avec une règle dbd: doit pouvoir faire l'affaire aussi, mais je ne suis pas très sûr que ce soit parfaitement "safe" vis-à-vis des injections SQL.

Jacques.

Share this post


Link to post
Share on other sites

Respect !

C'est vrai j'utilise mod_h264_streaming et je pense que le problème vient de là. Mais j'utilise pas le mod_php

Je te fais confiance, tu me dis ce le mieux qui est à faire, je te suis :)

Share this post


Link to post
Share on other sites

Bon,

J'ai testé le mod_php avec virtual($fichier); aucun changement...

Suite à quelques recherches sur le net, il semblerait que ça soit un problème de http-pseudo-streaming qui ne passe pas avec le RewriteRule.

Mais je n'ai aucune idée comment je dois m'y prendre..

Edited by xaltaz

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...