Limiter les téléchargements aux fichiers payés uniquement

WRInaute accro
Bonsoir,

Je cherche un moyen de proposer directement au téléchargement les fichiers achetés par mes clients.
Les quelques 100 fichiers fichiers seront regroupés dans un répertoire unique.
Chaque client a une référence de commande, laquelle, via une table mysql, donne la liste des fichiers achetés.

Comment faire pour :

- le client ne puisse télécharger que ce qu'il a payé ? (au cas où il tente des URL "au hasard")
- éviter qu'un tiers accède lui aussi aux fichiers ?

Je ne sais pas par quel bout prendre le problème.

Merci d'avance,

Michaël
 
WRInaute impliqué
Dans le dossier où sont stockés les fichiers, tu met un ".htaccess" avec comme contenu :
Code:
Deny from all
Ce qui provoquera une erreur « 403 Forbidden » lors de l'accès directe aux fichiers.
Une autre solution (plus sur) est de sortir les fichiers du « Document Root », ainsi, il sera impossible d'y accéder directement.
Exemple :
Code:
www => apache (ou autre) pointe ici (directive DocumentRoot).
files => les fichiers

Voilà pour la partie « protection d'accès ».

Maintenant, comment faire pour télécharger les fichiers ? Eh bien, avec PHP (ou autre).
Voici un exemple très très simple :
Tu définies un fichier PHP pour le téléchargement (on va dire telecharger.php). Tu passes en paramètre un ID de fichier qui va identifier le fichier à télécharger (laison avec MySQL).
PHP:
<span class="syntaxdefault"><br /></span><span class="syntaxkeyword"><?</span><span class="syntaxdefault">php<br /></span><span class="syntaxcomment">// tu sélectionnes ici les informations liées au fichier demandé<br /></span><span class="syntaxdefault">$req </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> mysql_query</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"SELECT * FROM Files WHERE id = "</span><span class="syntaxkeyword">.(int)</span><span class="syntaxdefault"> $_GET</span><span class="syntaxkeyword">[</span><span class="syntaxstring">"id"</span><span class="syntaxkeyword">]);<br /></span><span class="syntaxdefault">if </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">false </span><span class="syntaxkeyword">!==</span><span class="syntaxdefault"> $file </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> mysql_fetch_array</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$req</span><span class="syntaxkeyword">))</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault">    </span><span class="syntaxcomment">// tu fais tes vérifications (accès autorisé, stats, etc.)<br /></span><span class="syntaxdefault">    <br />    </span><span class="syntaxcomment">// ensuite, on force le téléchargement du fichier<br /></span><span class="syntaxdefault">    $name </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> $file</span><span class="syntaxkeyword">[</span><span class="syntaxstring">"name"</span><span class="syntaxkeyword">];<br /></span><span class="syntaxdefault">    $path </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> </span><span class="syntaxstring">"/chemin/vers/tes/fichiers/"</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$name</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">    $size </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> filesize</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$path</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">    session_write_close</span><span class="syntaxkeyword">();</span><span class="syntaxdefault"> </span><span class="syntaxcomment">// Permet de continuer à naviguer sur le site durant le télécharegment<br /></span><span class="syntaxdefault">    if</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">ini_get</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'zlib.output_compression'</span><span class="syntaxkeyword">))</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault">        ini_set</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'zlib.output_compression'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> </span><span class="syntaxstring">'Off'</span><span class="syntaxkeyword">);</span><span class="syntaxdefault"> </span><span class="syntaxcomment">// règle un bug sous IE si compression GZIP active.<br /></span><span class="syntaxdefault">    </span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault">    header</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'Cache-Control: no-cache'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">    header</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'Cache-Control: post-check=0,pre-check=0'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">    header</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'Cache-Control: max-age=0'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">    header</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'Pragma: no-cache'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">    header</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'Content-Length: '</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$size</span><span class="syntaxkeyword">);</span><span class="syntaxdefault"> </span><span class="syntaxcomment">// utile pour avoir la progression de téléchargement<br /></span><span class="syntaxdefault">    header</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'Content-Type: application/force-download; name="'</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$name</span><span class="syntaxkeyword">.</span><span class="syntaxstring">'"'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">    header</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'Content-Disposition: attachment; filename="'</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$name</span><span class="syntaxkeyword">.</span><span class="syntaxstring">'"'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">    header</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'Content-Description: "Téléchargement de fichier"'</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">    readfile</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$path</span><span class="syntaxkeyword">);<br /><br />}<br /></span><span class="syntaxdefault"> </span>
Bon, ce n'est pas exempt de bug ^^

En gros, c'est ce qu'il faut faire.
 
WRInaute accro
Je le ferai mais c'est la troisième étape d'une série d'évolutions et je commence seulement la première ! :)
 
WRInaute accro
OTP a dit:
- le client ne puisse télécharger que ce qu'il a payé ? (au cas où il tente des URL "au hasard")
Tu peux lui envoyer en pièce jointe via un simple mail donc aucune exposition des ressources a autre chose que ton script de mail qui lui est sous contrôle (a mon avis c'est le plus simple).

Sinon vérifier la validité d'un couple "numéro client" / "nom de fichier" dans une table comportant les mêmes couples pour les clients ayant fait un achat peut apporter la garantie que le fichier demandé est bien légitime. il faut alors avoir mis en place un script frontal qui gère toutes les requêtes sur le dossier et qui a la capacité de vérifier en base que la demande est correcte, ce qui semble être la solution proposée par Blount.

Les urls devrait alors avoir la forme http://www.example.com/download/clientX/fichier-truc.php et ton script devrait être capable d'extraire "clientX" et "fichier-truc".

Tu peux de plus limiter le nombre d'accès a cette url pour éviter les downloads a répétition.

OTP a dit:
- éviter qu'un tiers accède lui aussi aux fichiers ?
Tu ne pourra pas éviter le "partage" que ton client peut faire de son achat sauf a l'avertir que le contenu est sous licence (comme les OS par exemple).
 
WRInaute accro
le mieux serait de lui créer à la volée une archive zip contenant uniquement les fichiers qu'il a achetés, avec une url du genre exemple.com/da74ze5f8sdfr et avoir ce lien dans une table. Dès qu'il a été chargé une fois, tu n'autorises un autre accès que depuis la même ip et le même navigateur sur une durée de 24h, ensuite, plus accessible, ou alors en te contactant par mail.
 
Discussions similaires
Haut