Bonjour à tous bande de fous, (développeur, un métier beaucoup trop casse tête !!)
Je suis actuellement en train de gérer des fichiers assez importants, qui pourront être uploadés par l'administrateur sur le site, et consultables/téléchargeables par les clients via un gestionnaire de fichier. Chaque client a accès à seulement un dossier.
Je viens m'adresser à vous car après moultes recherches (ah oui oui, moultes !) , je ne trouve vraiment aucune réponses (ça fait un moi que je suis sur se site, il m'ait arrivé beaucoup de problème, ai j'ai réussit par les résoudre sans aide, croyez-moi, pour celui-ci aussi j'ai bien cherché ! mais sans résultats concrets).
Je vous explique mon problème : Les dossiers des clients sont protégés par un .htaccess contenant "deny from all" (ainsi que des lignes qui me sont inconnues, trouvées sur le web, pour bloquer les scripts php ou autres), permettant la consultation des dossiers uniquement depuis le site web.
L'administrateur se connecte et peut alors uploader les fichiers dans les dossiers voulu, mais le code PHP s'exécute seulement si mon dossier est en écriture publique (777 ou 775 par exemple). Le problème est avant tout la sécurité, si mon dossier est en 777, tout marche correctement.
Arborescence :
|_DossierSiteWeb
_|_ masterFolder
___|_premierClientFolder
_____|_fichierUploade.pdf
_|_.htaccess (dans masterFolder, oui).
Lignes Fichiers .htaccess
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Order Deny,Allow deny from all php_flag engine off AddHandler cgi-script .php .php3 .php4 .phtml .pl .py .jsp .asp .htm .shtml .sh .cgi Options -ExecCGI <Limit PUT DELETE> order deny,allow deny from all </Limit>
Mon code PHP :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 if(isset($_SESSION['admin']) && !isset($_SESSION['user'])) { if(isset($_POST['path'])) /* $_POST['path'] = "masterFolder/premierClientFolder" */ { $storeFolder = "gestionnaireFolder/" . $_POST['path']; if (!empty($_FILES)) { $tempFile = $_FILES['file']['tmp_name']; $targetPath = dirname( __FILE__ ) . "/". $storeFolder . "/"; $targetFile = $targetPath. $_FILES['file']['name']; move_uploaded_file($tempFile,$targetFile); } } }
J'ai essayé beaucoup de solution, la dernière avant d'écrire ses lignes a été d'essayer chown avant ET après le move_upload, sans résultat..
J'ai aussi essayé la fonction ftp_put, mais je n'ai pas réussit à la faire marcher avec un formulaire (impossible, non?).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 chown($targetPath, 777); move_uploaded_file($tempFile,$targetFile); chown($targetPath, 700);
Si je comprends bien, le fichiers .htaccess permet de bloquer les actions sur les dossiers/fichiers tant que ceci n'est pas effectué depuis les scripts php interprétés par le serveur.
J'ai aussi essayé de faire en sorte qu'à la connexion, l'administrateur ai les droits Administrateur sur le FTP pour pouvoir uploader en Admin, j'ai aussi essayer avec les permissions de groupe, mais ça ne change rien, je ne comprends absolument pas comment marche le système de droits (sur FTP) en PHP.
Ce que je voulais savoir :
Est-ce possible qu'un "hackeur" introduise des fichiers sur mon FTP sans utiliser mon site web ?
Est-ce que le fichier .htaccess bloque VRAIMENT toutes actions sur les dossiers ciblés sans utiliser mon site web?
Si le système d'upload via un formulaire est-il donc la bonne solution pour garder mon dossier sécurisé ?
Est-il possible de faire en sorte que le Fichier uploadé soit bougé par le script sans que le dossier de réception soit en exécution publique? (profiter de la permission groupe ou admin?)
(si possible) Les lignes en plus de "deny from all" dans mon .htaccess permettent-elles de bloquer l'exécution de scripts (indésirable!) ?
Merci de m'avoir lu, en espérant avoir des réponses positives !
B0unti.
Partager