Accueil | Aide en ligne | Annuaire | Sécurité | Articles | Astuces | Téléchargements | Association 


Mon compte SOS Ordi

Vous n'êtes pas identifié
[-> S'inscrire à SOS Ordi
[-> Mot de passe perdu ?
S'identifier


Rechercher sur SOS Ordi

Ok

Dans





 Catégories de l'aide en ligne

 Aide en ligne


 Saviez vous que ...

Si vous résolvez une question, vous gagnez des points


 Partenaires

  SOS Ordi > Aide en ligne > Logiciel > Développement > Web > Restrictions d'acces / acces en php uniquement

Restrictions d'acces / acces en php uniquement

17 réponse(s)
dont 12 ont aidé flowil à résoudre son problème

  Problème résolu posté le 06/03/2007 à 19:57
Profil Configuration PC
flowil


ringkey_micka_suite
État : Absent
Salut à tous !


Voila ce que j'essaie de faire :
- j'ai une page en php : si le mot de passe est bon, on affiche le contenu de la page, et si le mot de passe est pas bon, on affiche un formulaire de demande de mot de passe, qui actualise la page.
- si le mot de passe est bon, la page affichée propose de télécharger des fichiers (word par exemple).
- j'aimerais qu'il soit impossible de télécharger ces fichiers sans passer par cette page de mot de passe, et bien sûr sans avoir mis le bon mot de passe.

J'ai déjà longuement cherché, mais j'ai pas trouvé. Faut-il utiliser un htaccess ?

PS : je suis hébergé chez free !



Merci pour vos propositions !

   

Bas de page 


Information

Pour participer vous devez d'abord être membre ou identifié :
[-> M'identifier
[-> Je ne suis pas membre SOS Ordi, je souhaite m'inscrire
[-> J'ai perdu mon mot de passe


  Réponse postée le 06/03/2007 à 21:05
Profil du membre Configuration PC
spottydj



État : Absent
Bonjour,

La solution serait de stocker ces fichiers dans un dossier qu'on ne peut pas lister (donc mettre un .htaccess avec dedans "deny from all").

Ensuite, en PHP proposer le téléchargement via ce code :
Code :

<?php

// on essaie de reconnaitre l'extension pour que le téléchargement corresponde au type de fichier afin d'éviter les erreurs de corruptions

switch(strrchr(basename($Fichier_a_telecharger), ".")) {

case ".gz": $type = "application/x-gzip"; break;
case ".tgz": $type = "application/x-gzip"; break;
case ".zip": $type = "application/zip"; break;
case ".pdf": $type = "application/pdf"; break;
case ".png": $type = "image/png"; break;
case ".gif": $type = "image/gif"; break;
case ".jpg": $type = "image/jpeg"; break;
case ".txt": $type = "text/plain"; break;
case ".htm": $type = "text/html"; break;
case ".html": $type = "text/html"; break;
default: $type = "application/octet-stream"; break;

}

header("Content-disposition: attachment; filename=$Fichier_a_telecharger");
header("Content-Type: application/force-download");
header("Content-Transfer-Encoding: $type\n"); // Surtout ne pas enlever le \n
header("Content-Length: ".filesize($chemin . $Fichier_a_telecharger));
header("Pragma: no-cache");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
header("Expires: 0");
readfile($chemin . $Fichier_a_telecharger);
?>


Ensuite, pour l'accès par mot de passe, je te conseille t'utiliser ta base de données mysql pour stocker les nom d'utilisateurs et mots de passe.
Il te faut donc, une table avaec 2 champs minimum : login et mot_de_passe.
Puis, en php, tu vérifie que l'utilisateur est présent dasn la base.

Code :


//On suppose que le code de connexion à la bdd est déjà écrit
$login = $_POST['login'];
$mot_de_passe = $_POST['mot_de_passe'];

$rs = mysql_query("SELECT * from table_utilisateurs where login = '$login' AND mot_de_passe = '$mot_de_passe'");
if (mysql_num_rows($rs)>0){
echo "Tout est bon !";
} else {
echo "Erreur dans le login ou le mot de passe";
}


Réplique du développeur : Moi on m'a demandé un programme qui fonctionne, pas une oeuvre d'art !

  Réponse postée le 06/03/2007 à 21:15
Profil du membre Configuration PC
flowil



État : Absent
Merci pour tout ce code.

Pour la base de données, je n'en aurai pas besoin, puisque mon mot de passe est le même pour tout le monde.

Sinon, j'ai de bonnes bases en php, mais je ne sais pas manipuler les headers. Comment on fait pour créer un lien qui fasse télécharger le fichier ?
Faut-il remplacer dans ton code $Fichier_a_telecharger par le nom de mon fichier, ou bien laisser tel quel ?
Dsl pour mon ignorance !

  Réponse postée le 07/03/2007 à 12:33
Profil du membre Configuration PC
spottydj



État : Absent
Pour sécuriser un maximum, et masquer le chemin de téléchargement du fichier, il faudrait que tu aies tes fichiers stockés en base de donnée.

Donc une table table_fichiers avec 2 champ : id_fichier et nom_fichier (eventuellement extension_fichier pour faciliter le traitement lié à l'extension). id_fichier est une clé primaire.
Ensuite, je reprend le code en expliquant :

fichier download.php :
Code :



<?php

//Variable pour stocker le chemin du fichier :
$chemin = "/fichiers/download/"

//On récupère l'id_fichier passé en paramètre, et on sort si il n'existe pas.
if (!is_null($_GET["id_fichier"]) && is_numeric($_GET["id_fichier"])) {
$id_fichier = $_GET["id_fichier"];
}
//Puis on récupère le nom de fichier dans la bdd
//On suppose que le code de connexion à la bdd est déjà écrit
$rs = mysql_query("select nom_fichier from table_fichiers where id_fichier = $id_fichier");

//On vérifie que le fichier demandé existe :
if (mysql_num_rows($rs)>0){
$o_fichier = mysql_fetch_object($rs);
$Fichier_a_telecharger = $o_fichier->nom_fichier;
} else {
exit("Ce fichier n'existe pas !");
}




// on essaie de reconnaitre l'extension pour que le téléchargement corresponde au type de fichier afin d'éviter les erreurs de corruptions

switch(strrchr(basename($Fichier_a_telecharger), ".")) {

case ".gz": $type = "application/x-gzip"; break;
case ".tgz": $type = "application/x-gzip"; break;
case ".zip": $type = "application/zip"; break;
case ".pdf": $type = "application/pdf"; break;
case ".png": $type = "image/png"; break;
case ".gif": $type = "image/gif"; break;
case ".jpg": $type = "image/jpeg"; break;
case ".txt": $type = "text/plain"; break;
case ".htm": $type = "text/html"; break;
case ".html": $type = "text/html"; break;
default: $type = "application/octet-stream"; break;

}

header("Content-disposition: attachment; filename=$Fichier_a_telecharger");
header("Content-Type: application/force-download");
header("Content-Transfer-Encoding: $type\n"); // Surtout ne pas enlever le \n
header("Content-Length: ".filesize($chemin . $Fichier_a_telecharger));
header("Pragma: no-cache");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
header("Expires: 0");
readfile($chemin.$Fichier_a_telecharger);
?>




Appel du fichier download.php :
Code :

<a href="download.php?id_fichier=5">Télécharger !</a>



En espérant que ça t'aide clinoeuil.gif

Edité par spottydj le 07/03/2007 à 12:34



Réplique du développeur : Moi on m'a demandé un programme qui fonctionne, pas une oeuvre d'art !

  Réponse postée le 07/03/2007 à 14:02
Profil du membre Configuration PC
flowil



État : Absent
Stocker mes fichiers dans une base de données n'est-il pas un peu disproportionné par rapport à ce que je veux faire ?

Ne suffirait-il pas de mettre un .htaccess dans mon dossier de fichiers (avec deny from all), et de forcer le telecharement via la page download.php ?

À ce moment-là, quel code faut-il que je mette ?

Sur ma page de liens :

Code :

<a href="download.php?fichier=[nom de mon fichier]">télécharger</a>


et sur download.php :

Code :

<?php

$chemin = "fichiers/";

// on essaie de reconnaitre l'extension pour que le téléchargement corresponde au type de fichier afin d'éviter les erreurs de corruptions

switch(strrchr(basename($Fichier), ".")) {

case ".gz": $type = "application/x-gzip"; break;
case ".tgz": $type = "application/x-gzip"; break;
case ".zip": $type = "application/zip"; break;
case ".pdf": $type = "application/pdf"; break;
case ".png": $type = "image/png"; break;
case ".gif": $type = "image/gif"; break;
case ".jpg": $type = "image/jpeg"; break;
case ".txt": $type = "text/plain"; break;
case ".htm": $type = "text/html"; break;
case ".html": $type = "text/html"; break;
default: $type = "application/octet-stream"; break;

}

header("Content-disposition: attachment; filename=$Fichier");
header("Content-Type: application/force-download");
header("Content-Transfer-Encoding: $type\n"); // Surtout ne pas enlever le \n
header("Content-Length: ".filesize($chemin . $Fichier));
header("Pragma: no-cache");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public");
header("Expires: 0");
readfile($chemin . $Fichier);
?>




Mon code est-il correct ?

Edité par flowil le 07/03/2007 à 14:15


  Réponse postée le 07/03/2007 à 17:29
Profil du membre Configuration PC
spottydj



État : Absent
Citation de flowil, 07/03/2007 à 14h02 :


Code :

<a href="download.php?fichier=[nom de mon fichier]">télécharger</a>




Ce n'est pas disproportioné, car ce genre de lien est a bannir ! En effet, le fait d'accepter en paramètre d'URL des noms de fichiers (donc des chaines de caractère variables) est une énorme faille de sécurité. Donc je préfère largement passer un identifiant numérique, qui renverra à la base de données.
Après cet avertissement, libre à toi d'ouvrir cette faille de sécurité clinoeuil.gif

Et pour ton code, n'oublie pas que les paramètre passés dans l'url se récupèrent via $_GET ($_GET["fichier"]).

Edité par spottydj le 07/03/2007 à 17:29



Réplique du développeur : Moi on m'a demandé un programme qui fonctionne, pas une oeuvre d'art !

  Réponse postée le 07/03/2007 à 17:34
Profil du membre Configuration PC
flowil



État : Absent
Ah ok, je savais pas.
Mais en quoi est-ce une faille de sécurité (pour ma culture) ?

  Réponse postée le 07/03/2007 à 23:13
Profil du membre Configuration PC
flowil



État : Absent
Alors avec la base de données, il me met l'erreur suivante :

Parse error: syntax error, unexpected T_IF in ....../download.php on line 7


En ligne 7, il y a :

Code :

if (!is_null($_GET["id_fichier"]) && is_numeric($_GET["id_fichier"])) {
$id_fichier = $_GET["id_fichier"];
}



D'où vient le problème ?

  Réponse postée le 07/03/2007 à 23:41
Profil du membre Configuration PC
spottydj



État : Absent
Lol, copier coller brut de décoffrage ^^

Oui je suis allé un peu vite, ce gerne d'erreur arrive très souvent, et elle est due a ..... un point virgule qui manque ici :

Code :

$chemin = "/fichiers/download/" ;


donc à la ligne d'avant, allez savoir pourquoi ^^ !

Edité par spottydj le 07/03/2007 à 23:41



Réplique du développeur : Moi on m'a demandé un programme qui fonctionne, pas une oeuvre d'art !

  Réponse postée le 07/03/2007 à 23:44
Profil du membre Configuration PC
flowil



État : Absent
ok je vais essayer comme ça, alors !

  Réponse postée le 07/03/2007 à 23:55
Profil du membre Configuration PC
flowil



État : Absent
Alors, le téléchargement se lance bien, mais le fichier .doc qui se télécharge est rempli de balises html, semblant balancer des erreurs, du genre :

<b>Warning</b>: filesize() [<a href='function.filesize'>function.filesize</a>]: open_basedir restriction in effect. File(/fichiers/biopath1_principes_generaux.doc) is not within the allowed path(s): ...


ça peut venir du fait que j'ai un
.htaccess dans ce dossier avec deny from all ? Ou bien ça vient d'autre chose ?

  Réponse postée le 08/03/2007 à 01:23
Profil du membre Configuration PC
spottydj



État : Absent
C'est peut-être un problème de droits,

Essaye ceci plutot
Code :

$chemin = "fichiers/download/" ;


il se pourrait que le / du début indique la racine du serveur, et free ne veut pas que l'on y touche ^^.

Citation de flowil, 07/03/2007 à 17h34 :
Ah ok, je savais pas.
Mais en quoi est-ce une faille de sécurité (pour ma culture) ?



Puis pour répondre à ça, c'est facile pour un pirate de taper une URL plus ou moins douteuse qui pourrait lui permettre de s'octroyer ton serveur et d'en faire ce qu'il veut clinoeuil.gif .

Réplique du développeur : Moi on m'a demandé un programme qui fonctionne, pas une oeuvre d'art !

  Réponse postée le 08/03/2007 à 10:15
Profil du membre Configuration PC
flowil



État : Absent
Effectivement, le problème devait venir de ce /.
Merci beaucoup !

  Réponse postée le 08/03/2007 à 10:16
Profil du membre Configuration PC
Robot SOSORDI



État : Absent
Réponse automatique :

Cette question est résolue

  Réponse postée le 08/03/2007 à 19:30
Profil du membre Configuration PC
flowil



État : Absent
Il semblerait que les téléchargements de .ppt soient délicats : le fichier téléchargé n'est pas fonctionnel ! Alors qu'un .doc fonctionne bien.
Mes .ppt sont assez gros (entre 30 et 40 Mo). Je sais pas si ça a une incidence, mais je préfère le préciser.
De plus, il semblerait que mon logiciel de téléchargements (netTransport) essaie de télécharger plusieurs fois le tout début du fichier. Il lui est également impossible de télécharger sous plusieurs sessions en même temps.
D'où peut venir le problème ?

  Réponse postée le 08/03/2007 à 20:04
Profil du membre Configuration PC
flowil



État : Absent
Je viens d'essayer en mettant mon ppt dans un zip, et le problème est le même : le zip est non fonctionnel !

Le problème serait-il dû aux gros fichiers ? C'est bizarre, quand même !

  Réponse postée le 09/03/2007 à 00:36
Profil du membre Configuration PC
spottydj



État : Absent
Alors la je sais pas ^^.
J'ai jamais été confronté à ce problème encore.

Réplique du développeur : Moi on m'a demandé un programme qui fonctionne, pas une oeuvre d'art !

  Réponse postée le 09/03/2007 à 10:45
Profil du membre Configuration PC
flowil



État : Absent
Bon, ben tant pis, alors.
J'ai trouvé une parade, qui vaut ce qu'elle vaut : j'ai converti mes ppt en pdf. Et là ça marche.
Va savoir !



Haut de page 

 

Version 5.6 | Infos / Contacts | Partenariat | Publicité