Faire des URL temporaires pour contrer le leeching

Nouveau WRInaute
Salut,

Sur un site de téléchargement de vidéos, je souhaiterais en limiter l’accès de telle façon qu’il soit nécessaire de passer par la page descriptive de la vidéo avant de la regarder.

- Je veux donc interdire les accès directs du type :
www.example.com/videos/video23.wmv

- Le but est également d’empêcher les autres webmasters de l’afficher sur leur site comme si elle était à eux et donc de me piquer ma bande passante.

=> J’ai essayé le code suivant, mais sans rentrer dans les détails, il ne résout pas totalement le problème. Le même code marche très bien pour les images (si on rajoute les bonnes extensions), mais pour les vidéos c’est pas le top.

Code:
RewriteCond %{HTTP_REFERER} !^http://(www\.)?monsite.com\.com/ [NC] 
RewriteCond %{HTTP_REFERER} !^$ 
RewriteRule \.(mp4|mp3|wmv|mov|avi|mpg|mpeg)$ elements/nohotlink.gif  [NC,L]


=> J’ai donc pensé à une autre solution, mais je n’arrive pas à la mettre en place : elle consiste à affecter une URL temporaire aux vidéos en fonction, par exemple, de la date.

Par exemple :
Code:
RewriteRule ^%{TIME_DAY}/(.*).wmv$ videos/$1.wmv [NC,L]

Comme ça le lien vers une vidéo n’est valable que 24 heures. Mais là il est trop facile de deviner qu’il s’agit de changer le numéro de jour dans l’url, donc j’aurais aimé quelque chose d’un peu plus compliqué, du genre :
www.example.com/15646854/video23.wmv

Sachant que dans tous les cas, il faut que ce soit réalisable dans un fichier .htaccess, et il faut aussi que le script PHP puisse retrouver cette url.

Donc, est-il possible d’effectuer des opérations mathématiques dans un fichier htaccess ?
Parce que si je pouvais faire un %{TIME_DAY}*1564+485-%{TIME_MON} ça arrangerait déjà pas mal mes problèmes.

Je précise qu’il ne m’est pas possible d’effectuer des taches cron ou des trucs de ce genre.

Voilà, je pense que vous comprenez mon problème et que d’autres doivent avoir le même !
Si vous avez une solution, je suis preneur !

Merci
 
WRInaute impliqué
Sur un site j'ai eut ce problème là.
J'ai un répertoire contenant des programmes

Après un peu de réflexion, j'ai trouvé un truc qui fonctionne pas mal. Le premier utilisateur de la journée fait changer le nom du répertoire de téléchargement (avec un md5 par exemple), ce nouveau nom est inscrit dans la BDD.
Pour télécharger les programmes, il faut absolument passer par ma page php qui donne le nom de ce répertoire car c'est impossible de le trouver au pif. Du coup je ne le protège même pas par un .htaccess ....

Le nom du répertoire changeant tous les jours, un webmaster ne peut pas faire un lien direct vers les programmes (ou alors il doit aller le chercher tous les jours) :D
Et je ne crois pas que ça va le brancher....

Tu peux voir comment ça marche en bas de cette page http://www.jeromax.free.fr/index.php?R=netsend
Et c'est complètement transparent pour l'utilisateur
 
Nouveau WRInaute
Merci pour ta réponse. C'est vrai que ça a l'air d'être une solution interessante.

Sauf que dans mon cas, je préfererais ne pas changer le nom du dossier en dur, car le SAFE MODE est activé chez mon hébergeur, et souvent quand je fais des manipulations de fichiers / dossiers via PHP ensuite je perds les droits sur ceux ci... Enfin bref c'est la merde, et ensuite je suis obligé de demander au support technique de me remettre les droits... le bordel quoi. Et je ne souhaite pas changer d'hébergeur.

Donc voilà, d'autres idées ?
 
WRInaute passionné
Bonjour zolt,

- mettre les vidéos dans un répertoire dédié avec un mot de passe en .htaccess pour bloquer les accès extérieurs
- remplacer les liens vidéo par un script php avec le nom en paramètre :
- si le référent est ton site tu rediriges vers la vidéo avec un header() supplémentaire : content-type
- sinon tu rediriges vers ta page
 
WRInaute discret
Bonjour,

Pour éviter qu'on (me) pique (facilement) une video, j'utilise pour ma part Macromedia Flash MX. Je l'importe, le j'exporte au format .flv et je l'appelle avec le composant "offert" par le produit.

Exemple sur : -http://www.canneslions.be/fr/rmb-award/player.asp?id=160 (site en développement, soyez indulgent)

Je n'ai pas compliqué la chose mais, on pourrait subordonner le chargement à la condition que l'obje(c)t soit chargé à partir d'un domaine donné.

Cette possibilité nécessite une licence MF-MX mais elle offre l'avantage de ne pas dévoiler la source de votre vidéo. C'est une piste comme un autre, sans plus.

Bien à vous,
 
WRInaute occasionnel
Jeromax, je trouve ta solution excellente !!!

Moi qui cherche une solution efficace, je crois l'avoir trouvé !!! grâce à toi.

Mais voilà, juste une question, lors du renommage, comment ça va se passer ? Tous ceux qui téléchargait seront viré ? Sauf si on renomme vers les 5h du mat, là il ne devrait + rester grand monde mais, j'aimerai savoir auparavant ^^
 
Nouveau WRInaute
Merci pour vos réponses. Je vais finalement me diriger vers la solution de jeromax car j'ai réussi à piger un peu mieux comment dompter le safe mode.

Morph1er => Perso je pense définir que le premier user qui télécharge après 3h du mat, alors ce sera là que le dossier sera renommé. Car de 3h du mat à 9h c'est des heures creuses, mais y'aura bien un visiteur qui viendra télécharger une fois.
Car effectivement, je pense que si on veut renommer un dossier pendant qu'un autre s'en sert, ça risque de foirer pour un des deux.
Vers minuit, il y a encore du monde, d'où mon choix de décaler à 3h du mat. Qu'en penses-tu ?
 
WRInaute occasionnel
Oui le choix semble bon.

Moi je pensais faire ça via une tâche cron. Il me reste plus qu'à faire le script ^^. Mais va fallloir que je cherche pour créer une chaîne de caractères aléatoire.
 
Nouveau WRInaute
Un ptit md5(time()) et ça roule, que tu substr si c'est trop long. J'ai testé aujourd'hui et en terme de performance c'est imbattable comparé aux fonctions qui te créent une chaine alphanumérique.
 
Nouveau WRInaute
Bonjour, je suis exactement avec le même problème, je donne 3 vidéos wmv gratuites de 50Mo chacunes toutes les semaines et j'ai 500.000 visiteurs par mois...vous voyez le problème ! Ca me coute cher de rester gratuit...
Deplus étant chez online.net je ne peux pas mettre de .htaccess, bref la solution de jeromax me semble l'idéal.
Serais t'il possible d'avoir une partie de ton code ? (tu peux le signer), je n'ai plus fait de programmation depuis trop lontemps pour parvenir à le faire simplement.
Tu es mon dernier espoir :cry: :cry: :cry:

Ps : par contre il faudrait controler le referer je pense ? car le mec qui veut copier ton lien copie directement çà :
http://www.jeromax.free.fr/downloadProg.php?F=JXNetsend
et ca marche... :? (du coup je vois plus l'interet que tu changes ton repertoire en permanence)
 
WRInaute impliqué
oui bien sûr il faut controler le referrer (mais certains utilisateurs le cachent...).
En fait j'ai adapter mon cas à la question posée.
Cela me servait en fait à compter le nombre de téléchargements.
J'avais un programme sur telecharger.com dont je voulais compter le nombre de téléchargements depuis ce site, mais même en lui filant une adresse en amont, le site arrivait toujours à trouver l'adresse directe au fichier....
Du coup mon compteur perso ne comptait plus rien.
De cette manière, j'ai pu réussir à récupérer tous les téléchargements.
 
WRInaute impliqué
En fait, c'est un peu compliqué de le donner comme ça, parce qu'il y a plein de bout de code éparpillés...
Mais c'est assez simple à expliquer :D
C'est pas que je ne veux pas le donner, mais y'a rien à donner...
1. Dans une base, sauvegarder une nouvelle chaine de caractères à la noix (ex: sc248rtvyjb246rtthr26) avec une fonction genre rand+md5
2. Renommer le répertoire, où se trouve les infos que l'on veut "protéger",avec ce nom.
ex de path pour un fichier: -http://ww.tonsite/sc248rtvyjb246rtthr26/video.mpg
3. A chaque fois que vous souhaitez accéder à ce fichier, il faut aller chercher dans la base le nom à la noix et vous reconstruisez l'url

...après x temps vous repartez de 1.

Et voila, c'est devenu impossible de faire un lien direct vers le fichier video.mpg car ce lien ne sera valable que x temps...
 
Nouveau WRInaute
Voilà, moi c'est pareil sauf que le nom à la noix est stocké dans un fichier texte qui contient en ligne 1 : le nom à la noix, et en ligne 2 : la dernière date où le dossier a été renommé.
Donc pour récupérer ces 2 infos tu as juste à te servir de la fonction file().

Comme ça sur la page de téléchargement tu fais un test "Si la dernière date de renommage date d'avant aujourd'hui", alors on renomme et on stocke les nouvelles infos dans le fichier texte.
Genre nous sommes le 28/01/05, si le dernier renommage date du 27 alors on renomme.

Pour générer le nom à la noix un ptit md5(microtime()) et c'est bon il me semble.
 
Nouveau WRInaute
J'ai fait çà et ca marche, je laisse mon code pour les feignants.

Code:
<? 
$Datedujour = date(Ymd);
$NewRep = md5(microtime());

$host = ""; --A remplir
$user = ""; --A remplir
$pass = ""; --A remplir
$bdd = ""; --A remplir
mysql_connect($host,$user,$pass); 
mysql_select_db($bdd);
$table = ""; --A remplir

$SQL = "SELECT * FROM $table WHERE ID='1'"; -- Dans mon cas une seule ligne
$res = mysql_query($SQL);

while($val=mysql_fetch_array($res)) 
{
$Updated = $val["Updated"];
$Repertoire = $val["Repertoire"];

if($Datedujour>$Updated)
{
 rename($Repertoire,$NewRep);
 $SQL = "UPDATE $table SET Updated='".$Datedujour."',Repertoire='".$NewRep."' WHERE ID='1'";
 mysql_query($SQL);
}
echo "<a href=\"http://www.votresite.com/".$val["Repertoire"]."/mavideo.mpg\">";

}
mysql_close();
?>

Bon j'ai fais vite fait, et ca fait lontemps donc je suis un peu rouillé, je trouve le traitement assez long, y a t il un moyen d'optimiser mon code (un while pour un seul enregistrement est à changer non ?)
 
Nouveau WRInaute
Pas besoin du while effectivement : $val=mysql_fetch_array($res) suffit.

Sinon pour avoir des chiffres sur l'optimisation de ton code, tu peux toujours faire un $time = microtime(); en tout début de code, et un echo microtime()-$time; en toute fin de code. Ca te donne quel chiffre en moyenne si tu fais ça ?

L'usage d'un fichier texte au lieu d'une db permet peut-être d'optimiser tout ça ?
 
WRInaute impliqué
Oui mais il faut alors protéger le fichier txt par un .htaccess
Oui je sais c'est de la parano :twisted: , mais comme le but est d'empécher que quelqu'un te pique les fichiers.... C'est bête si le type reconstruit lui même l'url avec ton propre fichier txt qui affiche le nom du repertoire en clair... :wink:
 
Nouveau WRInaute
Heu, si tu donnes à ton fichier un nom à la con genre bguirzgqzg.txt, que seul ton script php connaitra, tu es tranquille non ?
Je n'ai toujours pas vu de script qui fonctionne et qui permette de te piquer tes sources php, donc à priori où est le risque ?
 
Nouveau WRInaute
enfait je prefere passer par une bdd vu que les liens que je met change chaque semaine, donc je me suis créé un acran d'admin pour rajouter mes vidéos, et derriere mon script s'occupe de gerer les url.

Sinon niveau temps finalemment ca va, en gros le premier mec qui arrive le jour d'apres se tape quelques sec, mais vu qu'il y a en 15000 derriere qui n'ont pas la modif, au final ca vaut le coup.

en tout cas merci, ca fait du bien de limiter sa bande passante, j'ai déjà une baisse de 30% en 3 jours ;-)
 
WRInaute impliqué
Plus simple tu cryptes l'url de téléchargement avec ton nom de fichier avec comme clef la date d'ajourd'hui, le lien sera valable 24 heures, sinon tu peux le crypter avec la date + l'heure (sans les secondes), le fichier sera valable 1 minute :)
 
Nouveau WRInaute
Merci pour le script, mais qu'est ce qu'il faut faire pour le faire marcher (comment créer la table du début ?)

Merci.
 
WRInaute discret
tiens, juste comme ça, avec les renommages à chaud... il se passe quoi si la vidéo fait 50 mb, que quelqu'un la télécharge a 23h55, finit en théorie vers 0h05 (ca dépend de la connexion je sais, c de la théorie pour mon exemple), et que un autre guignol se ramène à 0h01...
Le répertoire va-t-il être changé? est-ce que ca va foirer les téléchargements en cours? George Bush sera-t-il réélu président des USA?
 
WRInaute passionné
mouais, je vois pas en quoi cela sécurise trop l'access au repertoire, il reste assez aisé de récupérer le nom du repertoire dans ton fichier html...
 
Discussions similaires
Haut