Aller au contenu

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


xaltaz

Sujets conseillés

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.

Lien vers le commentaire
Partager sur d’autres 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.

Lien vers le commentaire
Partager sur d’autres 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.

Modifié par xaltaz
Lien vers le commentaire
Partager sur d’autres 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.

Lien vers le commentaire
Partager sur d’autres 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? :)

Lien vers le commentaire
Partager sur d’autres 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.

Lien vers le commentaire
Partager sur d’autres 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.

Lien vers le commentaire
Partager sur d’autres 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.

Lien vers le commentaire
Partager sur d’autres 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.

Lien vers le commentaire
Partager sur d’autres 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

Lien vers le commentaire
Partager sur d’autres 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.

Lien vers le commentaire
Partager sur d’autres 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 :)

Lien vers le commentaire
Partager sur d’autres 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..

Modifié par xaltaz
Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...