Bonjour,
je suis en train de me poser une question : Comment protéger une page vidéo ou plutôt le visionnage de la vidéo en lui même ?

Ce que je fais

Voici la situation :

  • on crée un site de contenu vidéo
  • le site à deux types de users : normal et premium
  • les users normaux n'ont accès qu'aux vidéos classiques et il faut être connecté
  • les users premium ont accès à toutes les vidéos et il faut avoir payé l'abonnement et être connecté
  • on part sur du Laravel / Symfony ou autre avec un système d'Auth
  • jusque là tout va bien, on protège chaque page avec des roles "regular" ou "premium"
  • sur chaque page on vérifie le role de la personne connecté et le type de vidéo (premium ou non)
  • jusque là tout marche et tout est protégé MAIS

Ce que je veux

Je ne veux pas que quelqu'un puisse télécharger la vidéo.

Ce que j'obtiens

On peut le faire de deux manière typiquement :

  • regarder le réseau dans la console et trouver le lien vers la vidéo
  • chercher la balise video et son src pour télécharger la vidéo en direct voire pire partager le lien à tout le monde

Les solutions que j'ai trouvé

  • Ne pas mettre un src avec le lien direct vers le fichier vidéo mais vers une page PHP qui ferait
    // partez du principe que $video et canWatchVideo() existe
    // $video serait un objet video de la bdd
    if (canWatchVideo($video)) {
    header('Content-type: video/mp4');
    echo file_get_contents($video->path);
    // ou directement : include $video->path;
    exit();
    }
  • Cela fonctionne pour protéger le lien mais n'empêche pas le téléchargement, comment faire ?
  • Quand c'est une grosse vidéo le chargement est plus long qu'avec un src vers le fichier vidéo direct...

Merci d'avance

21 réponses


Bonsoir,

tu peux essayer de faire comme fait grafikart sur le site, donc utiliser un "signer" d'url pour AWS, je ne sais pas si il existe quelque chose sous PHP (le mieux serait d'aller voir sur Packagist). Mais sur Ruby on rails il y a ça .

EDIT : J'ai trouvé ça pour PHP :

otakodes
Auteur

est-ce que le "signer" empêche le téléchargement sous pour autant bloquer la vidéo en lecture sur le site ?
Sinon oui j'utilise déjà aws pour mes assets en général mais ces assets ont toujours été téléchargeable en lien direct :/ @Laznet

Bah en faite apparemment ça permet de créer des liens pour protéger ton contenu.. Je suppose que ça empêche le téléchargement. Je vais laisser le reste de la communauté entrer dans les détails :D

otakodes
Auteur

@Laznet, dans tous les cas j'aimerai bien savoir comment faire ça en PHP car tout le monde ne peut pas / n'a pas envie des mettres ses fichiers sur amazone ou un CDN.
Surtout, j'ai envie de savoir comment ça fonctionne en interne :)

Je ne veux pas que quelqu'un puisse télécharger la vidéo.

C'est ça qui pose problème, perso j'ai abandonnée cette restriction mais avant j'utilisais Amazon Cloudfront pour streamer via rtmp:// (ça ne marchait pas sur mobile). Donc regarde de ce côté là ou revois cette condition.

otakodes
Auteur

@Grafikart pour le reste sinon ça te parait cohérent ? C'est ce que tu fais pour tes vidéos premium ?
Et d'ailleurs, j'avais testé de DL une de tes vidéos premium via l'url et c'était bien bloqué pourtant, enfin du moins ce que j'ai téléchargé n'était pas un fichier vidéo lisible.

@darkylmnx, tu avais testé ça quand ? Parceque j'ai changé le système il y a quelques mois.

otakodes
Auteur

@Grafikart il y a 4 jours quand la vidéo sur l'utf-8 était encore en premium justement, j'avais testé sur elle exprès pour voir comment tu gérais ça

Normalement si tu ouvre le lien de la vidéo tu peux la télécharger ;)

otakodes
Auteur

Là je n'ai plus le lien car la vidéo n'est plus en premium mais, je t'assure que que lien en src de ta vidéo premium ne télécharge pas la vidéo, ça me téléchargeai un fichier illisible haha qui faisait même pas le poids initial de la vidéo.

otakodes
Auteur

je referai le test à la prochaine vidéo premium

otakodes
Auteur

@Grafikart exemple avec ta vidéo sur les CSS grid

Tu ne pourras jamais cacher l'url comme tu le souhaite à moins de passer sur un clique en post

otakodes
Auteur

@Mehdikacim je n'ai pas compris ta phrase, je ne parle de cacher l'url à aucun moment... Le but c'est just d'empâcher les download et comme mon screen le prouve @Grafikart a réussi lui, si tu regardes ma bars de téléchargement on voit bien que les 3 tentatives de téléchargement ont échoué.

otakodes
Auteur

@Grafikart ça n'a l'air d'être bloqué que sur chrome :
Chrome : DL failed
Edge : DL Passed
FF : DL Passed

@darkylmnx : Tu copie le lien entier ? (avec les paramètres).

otakodes
Auteur

yes, j'ai carrément fait ouvrir dans un nouvel onglet via le

Parceque perso ça télécharge complètement

otakodes
Auteur

sur Chrome aussi @Grafikart ? ça doit être un bug de mon chrome. En tout la solution d'amazone semble être la meilleure.
Une implémentation perso ne semble pas si compliquée, je posterai la solution quand je l'aurai fait.

Bonjour à tous,

Je déterre ce sujet car j'ai un projet très similaire et il serait dommage d'ouvrir d'en ouvrir un nouveau pour expliquer la même chose ...

@darkylmnx : comment as-tu gérer cette problématique ?
@Grafikart : es-tu toujours sur un hébergement AWS pour tes vidéos premium sans protection, ou as-tu remis une autre protection en place ?

Que pensez-vous des solutions type JWPlayer ou Brid.tv, qui proposent des pack lecteur + hébergement 'sécurisé' - à des coûts non négligeable ? (mais quand est-il en comparant à une solution AWS ?) D'autres de ce type à me conseiller peut-être ?

Merci d'avance

Florent

otakodes
Auteur

@byflo au final je suis parti sur vimeo pour pas me prendre la tête, et je ne fais que protéger la page via une auth.

Par contre la solution aws fonctionnent bien mais est un peu cher pour ce que j'ai à faire (cher si il y a du traffic).

La technique d'AWS est assez simple à refaire en soi, mais tu n'aura pas forcément la même rapidité.

Il me semble que ce qu'il font c'est qu'il détect si l'url est chargé depuis un certain domain et un certain content-type. En gros ils mettent ton asset (vidéo ou image) sur une url genre files.monsite.fr

Quand un req arrive sur files.monsite.fr/:id, tu vérifie le referer, si le refererer est autre chose que monsite.fr (qui est celui qui va imbriquer la balise img ou video ou audio qui fera appel à ton asset sur files.monsite.fr), c'est que quelqu'un essaye d'accèder à ton url via un autre site ou même en direct, et du coup il faut interdire les liens en direct justement en vérifiant le referer.

Autre chose serait aussi de vérifie le content, quand la req se fait via une balise img / audio / vidéo elle n'envoie pas le même content-type que quand le mec essaye d'accèder direct à l'url via le navi.

Voilà en gros :)