Bloquer les téléchargements directs

Résolu/Fermé
gavroch74 Messages postés 65 Date d'inscription vendredi 27 février 2009 Statut Membre Dernière intervention 12 mars 2011 - 22 août 2010 à 16:26
 krakra - 2 mai 2014 à 18:15
Bonjour a tous et toutes, j'ai créer un site il y as quelque temps en xhtml/css sur le quel je propose des manuels téléchargeable (pdf-rar-zip) Je commence a m'intéresser au php depuis peu
Mes liens de téléchargement sont en html
<a href="mon-fichier.rar" ></a>

Et donc ma question est :

Est il possible de permettre un téléchargement sans pour autant que le lien soit visible
ainsi éviter les téléchargements direct !!

php JavaScript ou autre ?!

Merci d'avance

A voir également:

10 réponses

avion-f16 Messages postés 19250 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 22 décembre 2024 4 505
22 août 2010 à 18:46
Salut.

« Est il possible de permettre un téléchargement sans pour autant que le lien soit visible »
Je ne comprends pas très bien ...
Si le lien n'est pas visible, comment l'utilisateur doit-il faire pour télécharger le fichier ?

Pour moi, un "téléchargement direct", c'est un lien pointant vers le fichier.
Par exemple, sur un forum, tu poses un lien vers le fichier au lieu d'utiliser le chemin vers la page de téléchargement.
Si tu veux éviter ça, il va falloir passer par un script PHP. Celui-ci devra faire le lien entre le fichier et l'utilisateur. Le fichier devra être dans un dossier inaccessible via HTTP, c'est le script PHP qui le lira et qui enverra son contenu à l'internaute. Tu peux vérifier la provenance du visiteur avec $_SERVER['HTTP_REFERER'].

Voilà l'architecture :
- downloads/
- - fichier1.rar
- - fichier2.pdf
- - fichier3.zip
- - .htaccess
- download.php
- telechargements.html
Le contenu du .htaccess est simple :
Deny from all
pour download.php :
<?php
/* Configuration */
define('FILES_PATH', 'downloads/');
define('ALLOWED_HOST', 'example.com');


/* Script */
if(isset($_SERVER['HTTP_REFERER']) && isset($_GET['file']) && file_exists(FILES_PATH.$_GET['file'])) {
	if(preg_match('#^http://'.ALLOWED_HOST.'#i',$_SERVER['HTTP_REFERER'])) {
		$file = FILES_PATH.$_GET['file'];
		header('Content-Description: File Transfer');
		header('Content-Type: application/octet-stream');
		header('Content-Disposition: attachment; filename='.basename($file));
		header('Content-Transfer-Encoding: binary');
		header('Expires: 0');
		header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
		header('Pragma: public');
		header('Content-Length: ' . filesize($file));
		ob_clean();
		flush();
		readfile($file);
		exit;
	} else {
		header('HTTP/1.1 403 Forbidden');
		include 'views/errors/unauthorized_download.php';
	}
} else {
	header('HTTP/1.1 403 Forbidden');
	include 'views/errors/unauthorized_download.php';
}
?>
Pour faire les liens (telechargements.html) :
/download.php?file=fichier1.rar
/download.php?file=fichier2.pdf
/download.php?file=fichier3.zip

Dans views/errors/unauthorized_download.php, tu peux expliquer pourquoi l'utilisateur ne peut pas télécharger le fichier ou le rediriger vers la page de téléchargement (en PHP : location('/telechargements.html'); )
5
gavroch74 Messages postés 65 Date d'inscription vendredi 27 février 2009 Statut Membre Dernière intervention 12 mars 2011 13
23 août 2010 à 19:51
Ok !!! Très bien je comprend beaucoup mieux, merci pour ces infos!

Pour mon site j'ai appris doucement le html puis j'ai évoluer en xhtml/css
je compte maintenant tout refaire avec du php (pour rendre le site plus vivant et agréable) mais c'est un langage avec le quel j'ai un peu plus de mal a me familiariser.

Pour le moment je suis sur le site du zéro pour tenter d'apprendre et me familiariser avec le php, mais j'aime les défis et comprendre les conseilles que l'on me donne donc si tu as un bon lien pour apprendre les session je t'en serrai reconnaissent ?!!
1
gavroch74 Messages postés 65 Date d'inscription vendredi 27 février 2009 Statut Membre Dernière intervention 12 mars 2011 13
23 août 2010 à 11:35
Merci avion-f16 pour cette réponse constructive !!!
Je suis très novice en php et je vais tenter de comprendre et d'appliquer tous ça !
Je vais me replonger dans les cours du zéro :)
Merci encore et je tien au courant de l'évolution !!
0
gavroch74 Messages postés 65 Date d'inscription vendredi 27 février 2009 Statut Membre Dernière intervention 12 mars 2011 13
23 août 2010 à 13:17
Un grand merci a toi !! ca marche super bien et simple a réaliser !!
Merci encore et a bientôt :)
0

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

Posez votre question
Hello,
tu peux aussi utiliser les sessions pour que la page précédente pose un jeton en session et que la page de téléchargement vérifie ce dernier plutôt que le référer. En effet, ce dernier peut être usurpé

C'est donc plus sur, tu obliges ainsi à passer par la page que tu veux avant (tu peux même imaginer que la page A donne un jeton pour tel doc alors que la page B en donne un pour tel autre...)
0
gavroch74 Messages postés 65 Date d'inscription vendredi 27 février 2009 Statut Membre Dernière intervention 12 mars 2011 13
23 août 2010 à 15:02
"tu peux aussi utiliser les sessions pour que la page précédente pose un jeton en session et que la page de téléchargement vérifie ce dernier plutôt que le référer. "

Utiliser les sessions ? sauf si je me trompe une session = Login/mot de passe
style pour les forums , or mon site est un site accessible a tous donc pas de session mais peut-être que je me trompe j'ai tout a apprendre ;)

"En effet, ce dernier peut être usurpé"

Comment ca usurpé ?
0
Une session c'est beaucoup plus vaste que ça. Lorsqu'un visiteur arrive sur ton site, tu peux ouvrir une session sur le serveur. C'est à dire que tu crées un environnement associé à la visite et dans lequel tu peux mettre des variables.

Lorsque le visiteur demande une seconde page du site, tu peux retrouver la session et donc les informations que tu avais précédement stoquées. Comme la session est associée à un visiteur, tu peux sur une page mémoriser qu'il est passé sur le site et ensuite, sur la page de téléchargement, vérifier s'il est passé avant sur telle ou telle page avant d'autoriser le téléchargement...

Les sessions sont utilisées pour les forums, en effet, lorsque tu t'identifies, tu fournis ton login/mdp et le serveur mémorise que tel visiteur a fourni les identifiants de tel compte et ensuite, grace à la mécanique décrite plus haut, tu es "reconnu" d'une page à l'autre

Pour le référer, c'est une info passée par le navigateur au serveur. Il peut envoyer ce qu'il veut et c'est invérifiable. Il peut faire croire venir de telle page alors que c'est faux
0
avion-f16 Messages postés 19250 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 22 décembre 2024 4 505
23 août 2010 à 19:57
Un système de jeton est évidemment plus sécurisé, mais dans ce cas, ça ne sert à rien. Perso, je ne perdrais pas mon temps à écrire une requête HTTP à la main juste dans le but d'éviter de passer par une page de téléchargement. Le système avec le referer est largement suffisant, dans ce cas.
0
gavroch74 Messages postés 65 Date d'inscription vendredi 27 février 2009 Statut Membre Dernière intervention 12 mars 2011 13
23 août 2010 à 19:58
C'est bien ce que je pensais aussi mais c'est toujours bon a connaitre !
0
bonjour,

le script fonctionne mais par contre il arrive que les Téléchargements des fichiers tombe a 0 et affiche erreur reseau avant la fin

Comment on règle ce problème svp?

Merci d'avance
0