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

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par OTP, 7 Janvier 2012.

  1. OTP
    OTP WRInaute accro
    Inscrit:
    16 Décembre 2005
    Messages:
    14 715
    J'aime reçus:
    3
    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
     
  2. Blount
    Blount WRInaute impliqué
    Inscrit:
    18 Novembre 2010
    Messages:
    701
    J'aime reçus:
    0
    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.
     
  3. OTP
    OTP WRInaute accro
    Inscrit:
    16 Décembre 2005
    Messages:
    14 715
    J'aime reçus:
    3
    Ok, je vais essayer tout ça, merci !!!
     
  4. JanoLapin
    JanoLapin WRInaute accro
    Inscrit:
    21 Septembre 2008
    Messages:
    4 250
    J'aime reçus:
    0
    Ton retour serait intéressant.
     
  5. OTP
    OTP WRInaute accro
    Inscrit:
    16 Décembre 2005
    Messages:
    14 715
    J'aime reçus:
    3
    Je le ferai mais c'est la troisième étape d'une série d'évolutions et je commence seulement la première ! :)
     
  6. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    12 190
    J'aime reçus:
    1
    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.

    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).
     
  7. Leonick
    Leonick WRInaute accro
    Inscrit:
    8 Août 2004
    Messages:
    19 413
    J'aime reçus:
    0
    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.
     
  8. OTP
    OTP WRInaute accro
    Inscrit:
    16 Décembre 2005
    Messages:
    14 715
    J'aime reçus:
    3
    Ok, merci à vous deux.
    Je vois ça quand j'en serai arrivé là.
     
Chargement...
Similar Threads - Limiter téléchargements fichiers Forum Date
Limiter la zone d'expédition pour un produit e-commerce 24 Octobre 2019
Arfooo PHP 7 : (2) session_start(): Cannot send session cache limiter Annuaires et moteurs 31 Janvier 2019
Limiter un nombre à une valeur max dans SQL Administration d'un site Web 29 Mars 2018
Comment limiter le nombre de caractères d'un texte Développement d'un site Web ou d'une appli mobile 6 Août 2014
Duplicate content, 2 sites, même contenu. Comment limiter les dégâts ? Débuter en référencement 17 Juin 2014
Limiter le nombre de redirections Demandes d'avis et de conseils sur vos sites 25 Septembre 2013
Cannot send session cache limiter - headers already sent en php5 Développement d'un site Web ou d'une appli mobile 14 Mars 2013
Limiter nombre visiteurs simultanés ? Administration d'un site Web 16 Mars 2012
limiter les résultats d'une recherche google Développement d'un site Web ou d'une appli mobile 16 Septembre 2011
limiter les hotlinks Développement d'un site Web ou d'une appli mobile 13 Août 2011