Aller au contenu

Comment protéger l'upload / download php


cocco

Sujets conseillés

Bonjour a tous et toutes.

Je suis le fondateur d'un nouveau type de réseau-social évolutif.

Je donne la possibilité aux membres d'envoyer sur le serveur des fichiers allant jusqu'à 32 Mo.

Mon problème est le suivant, pour évité les pirates en tout genre (comme moi :whistling: ) je voudrai forcer le download de tout fichier.

De cette façon la brèche existante se refermera.

De plus je ne sais pas comment mis prendre pour empêcher l'ouverture d'une page tierce tel que google ou LePetitPirateTropMalin par injection GET.

Voici la source actuelle


// infos du fichier $name = $_GET['name'].';
$fichier = $_GET['name'];
$nom_fichier = strrchr($fichier, 'files/');


// téléchargement du fichier
header('Content-disposition: attachment; filename='.$nom_fichier);
header('Content-Type: application/force-download');
header('Content-Transfer-Encoding: fichier');
header('Content-Length: '.filesize($fichier));
header('Pragma: no-cache');
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
header('Expires: 0');
readfile($fichier);

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

À quoi ça sert de forcer le téléchargement du fichier ?

De plus, de quelle forme est le $_GET['name'] que les visiteurs atteignent normalement ? Une suite de caractères fsdijfdsp/, un autre truc ?

Lien vers le commentaire
Partager sur d’autres sites

Pour évité d'ouvrir un fichier qui vire la base de donnée ou qui supprime tout les pages du serveur.

J'ai testé, ça marche nickel :hypocrite:

Chaque membre qui reçois une pièce joint a un lien

download.php?name=files/hashfiles.extension.

J'imaginai pourvoir forcer le download, comme je l'ai vue sur un grand nombre de forum avec le code source.

Ou alors je devrai trouver une autre solution tel que Zipper le fichier a l'envoi.

Lien vers le commentaire
Partager sur d’autres sites

Ah, je n'avais pas compris ce que tu voulais dire par "forcer le téléchargement", mais ok, c'est plus clair.

Tu trouveras ton bonheur ici normalement, sur Comment forcer le téléchargement d'un fichier de developpez.com.

Pour la deuxième chose, une expression régulière qui te permet de vérifier que ta variable Get n'est pas une URL ?

Lien vers le commentaire
Partager sur d’autres sites

Ce serai l'idéal, j'avais pensé a vérifier qu'il n'y a pas de ftp:// http:// https://

ou la virée simplement de la requête GET

Merci pour le lien, je test a l'instant et je te dis quoi. ;)

Lien vers le commentaire
Partager sur d’autres sites

Merci pour ton aide Sarc,

J'ai trouvé un compromis global et l'ai déjà mis en place.

Dans ta signature, se sont tes sites :?:

Lien vers le commentaire
Partager sur d’autres sites

Pour ma part je n'ai toujours pas compris quelle était la brêche que tu souhaites combler comme ça, et en quoi ça change quoi que ce soit?

Sinon pour la partie validation, tout dépend de ce que tu fais des fichiers uploadés: est-ce-que tu conserves le nom de fichier original, tu les renommes (genre fichier1, fichier2, etc.), tu les stockes dans un seul et unique dossier, dans tout plein (problablement une meilleure option), tu les notes en base, etc.

Ca me paraîtrait logique pour ma part qu'ils soient renommés, stockés dans une hierarchie de dossiers, et notés en base. Par exemple le premier fichier serait stocké comme 00/00/01, et ainsi de suite. Ainsi quand quelqu'un veut télécharger un fichier, tu passes juste son id (qui est donc facile à valider), et à partir de là tu trouves son chemin, son nom pour le Content-Disposition (à partir de la base), et hop.

Mais j'ai peut-être loupé un épisode...

Jacques.

Lien vers le commentaire
Partager sur d’autres sites

Jacques,

Il veut que si les visiteurs uploadent un fichier PHP, ils ne puissent pas l'exécuter directement sur le serveur... Parce que si le fichier uploadé monattaque.php est dans un dossier et qu'en allant sur la page pour le télécharger, il est exécuté par le serveur au lieu d'être téléchargé, ça pourrait être préjudiciable.

Après, je n'ai pas fait de tests, moi, donc je sais pas si c'est faisable réellement ou pas, comme "attaque".

je test a l'instant et je te dis quoi.

Alors, comme ça, dans "Bienvenue chez les Ch'tits", il n'y aurait pas que des clichés ? :P

Dans ta signature, se sont tes sites ?

Je t'ai envoyé un MP, pour ne pas partir sur tous les sujets...

Lien vers le commentaire
Partager sur d’autres sites

Aaaah. Ben il suffit de mettre les fichiers dans une partie qui n'est pas accessible directement via Apache. Genre si ton DocumentRoot c'est /home/monserveur/www, tu mets les fichiers dans /home/monserveur/fichiers. Comme ça il y a obligation de passer par le script de download, et rien ne sera jamais interprété comme du php. Il y aurait encore une vague possibilité que ça pose un problème avec du html qui pourrait faire des choses qui requièrent d'être dans le domaine (genre manipulation de cookies, JS cross-frame, Xmlhttprequest...) donc effectivement le download forcé peut être une bonne idée.

Jacques.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...