ECommerce protection des fichiers numériques

Résolu
Sophie -  
 amaury07 -
Bonjour,

Je suis développeur web (débutante donc je ne connais pas trop les frameworks) et on m'a demandé de faire un site web de vente de fichiers numériques.

Je pense opter pour prestashop (j'ai testé osCommerce et c'est hors de question que je l'utilise, et Magento me semble lourd par rapport à mes besoins).

Pour protéger les fichiers, j'aurai besoin d'un outil, si possible opensource et gratuit (même si ce n'est pas le cas, toutes les solutions m'intéressent).
Je ne sais pas ce qui existe, mais j'imaginais un truc du genre : le client paye, il obtient un lien (par messagerie ou sur le site web) et tant que le téléchargement n'est pas effectué (complet) le lien reste valide. Dès qu'il a été téléchargé une unique fois, il n'est plus valable. (Il pourrait y avoir surveillance de l'ip. (quoi que ça pourrait poser problème si l'utilisateur achète puis télécharge plus tard à un autre endroit...)).
En fait, je ne veux pas que les clients accèdent à la localisation réelle des fichiers.

Je ne sais pas si un tel produit existe, ni si c'est facile de le développer (combien puis-je facturer ça?)

J'espère que vous pourrez m'aider

Sophie

A voir également:

9 réponses

Jm
 
Bonjour,

Le logiciel x-cart peut être te conviendra.

Il possède un module de gestion de fichiers numériques avec clé de téléchargement d'une durée que tu peux choisir.

De plus c'est un logiciel professionnel certifié sécurisé et adapté pour ce que tu recherches.

Il te suffit pour un produit de choisir le fichier correspondant et après le paiement le client reçoit automatiquement un lien codé pour qu'il puisse télécharger le fichier.

Va voir sur http://www.x-cart.fr. Il y a une démo en ligne. Au pire appel les il te le confirmeront.

Cordialement
2
avion-f16 Messages postés 20367 Statut Contributeur 4 509
 
Salut.

Tu expliques toi-même le fonctionnement du script, il ne reste plus qu'à le coder ...

Tu peux placer tous tes fichiers dans un dossiers "downloads" (par exemple).
Tu peux bloquer l'accès à ce dossier via HTTP grâce à un .htaccess :
deny from all

Il faudra une table, par exemple "download_keys", contenant ces champs :
- key (TINYTEXT ou (VAR)CHAR) : contient une chaine unique générée
- fichier_id (INT ; unsigned) : contient l'id correspondant au fichier dans la table "fichiers".

La table "fichiers" pourrait contenir ces champs au minimum :
- id (INT ; unsigned ; auto_increment) : La clé primaire
- chemin (TINYTEXT ou (VAR)CHAR) : contient le chemin vers le fichier, par rapport (relatif) au script PHP (cf. plus loin) ou bien le chemin absolu

Pour télécharger le fichier, le client devra passer par l'intermédiaire d'un script PHP car l'accès est bloqué via HTTP, seul le script PHP pourra lire le fichier. Mais avant d'envoyer le fichier au client, ce script devra vérifier s'il y a bien une entrée dans la table :
SELECT COUNT(*) AS nb FROM download_keys WHERE key = $_GET['key']
(attention: pense à sécuriser les variables dans tes requêtes SQL). Si oui, tu pourras récupérer l'id du fichier. Et grâce à cet ID, tu pourras récupérer le chemin du fichier.
Voilà comment faire un téléchargement en PHP :
https://www.php.net/readfile (regarde le 1er exemple).
Après, il faudra supprimer l'entrée :
DELETE FROM download_keys WHERE id = $_GET['key']


Pour générer une chaine en PHP, tu peux faire comme ceci :
uniqid(md5(time()).'_');
0
Sophie
 
arf...
D'un côté je suis pressée, mais de l'autre, c'est intéressant de tout implémenter soi-même.

Tu dis que j'explique le fonctionnement du script, mais je ne sais pas si mon idée est bonne. Il y a peut-être des façons de sécuriser plus efficaces?

Donc du coup, ça veut dire qu'on peut détecter quand un fichier commence à être téléchargé, qu'il est totalement téléchargé, etc?

Par contre, je n'ai pas trop compris comment faire pour cacher le chemin réel.
Si mon fichier est ici :
http://monsite.com/fichiers/monfichier.ext
Ok, on ne peut pas y aller, on va récupérer l'url qu'on stocke dans une variable php.
Mais après?
readfile(url) et c'est tout?

Du coup il n'y a pas de "fausse" url, si? (ou alors je n'ai rien compris)
0
avion-f16 Messages postés 20367 Statut Contributeur 4 509
 
Ta méthode est correcte.

« Donc du coup, ça veut dire qu'on peut détecter quand un fichier commence à être téléchargé, qu'il est totalement téléchargé, etc? »
Non, mais lorsque tu demanderas à PHP d'envoyer le fichier au client, tu peux supprimer l'entrée dans la table directement, tu n'es pas obligé d'attendre la fin.

Oui, un readfile() suffit. Cette fonction charge le contenu du fichier indiqué et l'envoie aussitôt au client. Mais pour forcer le téléchargement, il faut modifier les entêtes avec la fonction header(). Le code en premier exemple sur la page donnée fonctionne très bien.

Pour la fausse URL, ça sera ça :
http://example.com/telechargement.php?key=x14d8ze4fez6f96e (exemple :) )
Tu devras utiliser $_GET['key'] pour vérifier si une entrée est présente dans la table.
Si oui, tu récupères l'ID du fichier correspondant. Grâce à celui-ci, tu pourras récupérer le chemin du fichier.

Ton ordinateur ne fait pas ce que tu veux ... mais ce que tu lui dis de faire.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Sophie
 
Merci beaucoup pour toutes tes explications Avion-f16, tu m'as été très utile!
J'ai juste une dernière question :
Et si la connexion est interrompue pendant le téléchargement?
0
avion-f16 Messages postés 20367 Statut Contributeur 4 509
 
Là il y aura un problème. Au lieu de supprimer directement le lien de téléchargement (l'entrée dans "download_keys"), tu peux plutôt lui mettre une limite. Biensûr, au début du script telechargement.php, tu dois supprimer toutes les entrées dont la limite de temps est dépassée.

Si tu utilises cette technique, il faudra ajouter un champ "expiration" sur "download_keys". Cette colonne contiendra le timestamp au moment de la création de la clé plus le nombre de secondes dans un jour (24*3600 ; si tu veux mettre une limite de 24h). Il faudra exécuter cette requête au début :
$sql = 'DELETE FROM download_keys WHERE expiration < '.time()


Tu peux également mettre une limite de 2 IP. Ainsi, même si le client est déconnecté pendant le téléchargement et qu'à sa reconnexion il est de nouveau connecté, il pourra recommencer.

Encore une autre solution serait de passer via un applet Java (ne pas confondre avec Javascript). Mais ça sort de mes compétences, je sais juste que c'est possible.
0
Sophie
 
Je connais Java (mais jamais utilisé pour le web) donc je regarderais ça plus en détail.
Merci beaucoup pour ton aide!
0
jeanlit Messages postés 11 Statut Membre
 
je vous propose de zencart qui a la fonction spéciale à vendre les produits numérique.
0
amaury07
 
Bonjour

Au risque d'être hors sujet, il y a maintenant le site http://woopstore.com qui permet de vendre un contenu numérique sans s'embêter à faire une site WEB... ( ou en intégrant directement les liens d'achat) Si des fois ça peut intéresser du monde.

@ +
0