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


OTP
Modérateur
Modérateur
 
Messages: 19532
Inscription: 16 Déc 2005

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

Message le Sam Jan 07, 2012 21:21

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


Blount
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 430
Inscription: 18 Nov 2010

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

Message le Sam Jan 07, 2012 21:51

Dans le dossier où sont stockés les fichiers, tu met un ".htaccess" avec comme contenu :
Code: Tout sélectionner
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: Tout sélectionner
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).
Code: Tout sélectionner
<?php
// tu sélectionnes ici les informations liées au fichier demandé
$req = mysql_query("SELECT * FROM Files WHERE id = ".(int) $_GET["id"]);
if (false !== $file = mysql_fetch_array($req)) {
    // tu fais tes vérifications (accès autorisé, stats, etc.)
    
    
// ensuite, on force le téléchargement du fichier
    $name = $file["name"];
    $path = "/chemin/vers/tes/fichiers/".$name;
    $size = filesize($path);
    session_write_close(); // Permet de continuer à naviguer sur le site durant le télécharegment
    if(ini_get('zlib.output_compression')) {
        ini_set('zlib.output_compression', 'Off'); // règle un bug sous IE si compression GZIP active.
    }
    header('Cache-Control: no-cache');
    header('Cache-Control: post-check=0,pre-check=0');
    header('Cache-Control: max-age=0');
    header('Pragma: no-cache');
    header('Content-Length: '.$size); // utile pour avoir la progression de téléchargement
    header('Content-Type: application/force-download; name="'.$name.'"');
    header('Content-Disposition: attachment; filename="'.$name.'"');
    header('Content-Description: "Téléchargement de fichier"');
    readfile($path);

}
 

Bon, ce n'est pas exempt de bug ^^

En gros, c'est ce qu'il faut faire.


OTP
Modérateur
Modérateur
 
Messages: 19532
Inscription: 16 Déc 2005

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

Message le Dim Jan 08, 2012 8:37

Ok, je vais essayer tout ça, merci !!!


JanoLapin
WRInaute accro
WRInaute accro
 
Messages: 4054
Inscription: 21 Sep 2008

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

Message le Dim Jan 08, 2012 13:02

Ton retour serait intéressant.


OTP
Modérateur
Modérateur
 
Messages: 19532
Inscription: 16 Déc 2005

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

Message le Dim Jan 08, 2012 13:17

Je le ferai mais c'est la troisième étape d'une série d'évolutions et je commence seulement la première ! :)


zeb
WRInaute accro
WRInaute accro
 
Messages: 4560
Inscription: 5 Déc 2004

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

Message le Dim Jan 08, 2012 13:21

OTP a écrit:- 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 écrit:- é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).


Leonick
WRInaute accro
WRInaute accro
 
Messages: 19595
Inscription: 8 Aoû 2004

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

Message le Dim Jan 08, 2012 18:13

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.


OTP
Modérateur
Modérateur
 
Messages: 19532
Inscription: 16 Déc 2005

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

Message le Dim Jan 08, 2012 18:30

Ok, merci à vous deux.
Je vois ça quand j'en serai arrivé là.


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité