Discussion:
site securise
(trop ancien pour répondre)
Legeais Vincent
2007-06-02 20:00:39 UTC
Permalink
Bonjour,

Je souhaite faire un site donc l'accès se fera par login et mot de passe
aux seules personnes à qui j'aurai donné des identifiants.

Actuellement je sais faire 2 choses :

* soit gérer l'accès en mettant un .htaccess dès la racine.
Donc là, pas de problème, tout le contenu du site est protégé.

Mais je ne trouve pas jolie (esthétique) cette méthode
C'est pour cela que je préfère ma deuxième solution :

* mettre un formulaire dans lequel le visiteur met ses identifiants,
puis je vérifie dans la base de données et si oui je valide l'accès.
Par contre à chacune de mes pages je suis obligé de vérifier si la
personne y a accès...
Pour cela j'ai une variable de session, et de plus toutes mes pages sont
de la forme index.php?page=toto avec toto qui appelle la page inc/titi.php.
Le répertoire inc/ est protégé par un .htaccess "deny from all"

Donc tout va bien avec cette méthode (tout est bien protégé, et je peux
faire joli comme je veux (mieux en tout cas que la boîte du htaccess !)

Le seul problème est pour les fichiers multimédia (images, sons, vidéos).
Si je met un .htaccess "deny from all" sur le répertoire images/ alors
ça refuse l'affichage (normal puisque les images sont appelées par un
requête html).
Il en est de même pour les fichiers de style .css
(je me contente de mettre un index avec "header("Location: ..");" dans
ces répertoires, mais rien n'empêche un accès direct au fichier...)

Est-ce que quelqu'un aurait une solution pour garder l'accès avec
formulaire et vérification dans la base de données *et* que *tous* les
fichiers soient protégés ?

Merci

X-post : fr.comp.lang.php & alt.fr.comp.lang.php
fu2 : fr.comp.lang.php
--
Vincent
Legeais Vincent
2007-06-02 20:48:44 UTC
Permalink
Post by Legeais Vincent
[...]
X-post : fr.comp.lang.php & alt.fr.comp.lang.php
fu2 : fr.comp.lang.php
Je crois que j'ai oublié de faire le X-post... !!!
Tant pis pour moi...
--
Vincent
Thief13
2007-06-02 20:48:44 UTC
Permalink
Tu met tes fichier et tes images dans un répertoir avec htaccess deny
from all, et tu les récupère avec un fichier php qui controle les droit
et qui les réinjecte avec le bon mimi-type.

Je fait comme ça, et c'est super efficace !
Legeais Vincent
2007-06-03 13:28:27 UTC
Permalink
Post by Thief13
Tu met tes fichier et tes images dans un répertoir avec htaccess deny
from all, et tu les récupère avec un fichier php qui controle les droit
et qui les réinjecte avec le bon mimi-type.
Pour cela je pense adapter un script que j'utilise pour faire les
miniatures, ce qui donnerait cela :

appel : <img src='image.php?photo=photo.jpg'>
script image.php :
<?
header("content-type:image-jpeg");
$source = $photo;
$image = imageCreateFromJpeg($source);
imageJpeg($image);
imageDestroy($image);
?>
Post by Thief13
Je fait comme ça, et c'est super efficace !
Est-ce comme cela que toi tu fais ?
Si tu fais autrement, je veux bien savoir comment...

Par contre ceci ne fonctionne qu'avec les images...
Comment faire pour les sont et les vidéos ?
Et aussi pour les autres fichiers (.css) ?
Et pour un fichier .pdf par exemple ?

Merci
--
Vincent
P'tit Marcel
2007-06-03 13:45:58 UTC
Permalink
Post by Legeais Vincent
ceci ne fonctionne qu'avec les images...
Comment faire pour les sont et les vidéos ?
Et aussi pour les autres fichiers (.css) ?
Et pour un fichier .pdf par exemple ?
tous ces objets inclus en HTML peuvent être stockés dans un/des
répertoires accessibles du web. En général ce sont des objets placés par
le webmaster qui s'assure qu'ils ne sont pas dangereux.

Pour les objets inclus qui ont été uploadés par un autre utilisateur
(donc pas des css, du js ou du php), tu peux vérifier :
- leur type mime (http://faqfclphp.free.fr/#rub4.10)
cela évite les erreurs mais pas les tentatives malfaisantes
- les premiers caractères du fichier (voir le fil "Controler le type de
fichier envoye par un formulaire" en cours sur ce forum)
- leur suffixe (refuser .php? .js .java etc.)

eça
--
P'tit Marcel
Legeais Vincent
2007-06-03 14:08:21 UTC
Permalink
Post by P'tit Marcel
tous ces objets inclus en HTML peuvent être stockés dans un/des
répertoires accessibles du web. En général ce sont des objets placés par
le webmaster qui s'assure qu'ils ne sont pas dangereux.
Pour les objets inclus qui ont été uploadés par un autre utilisateur
[...]
Mon problème n'est pas la dangerosité des fichiers.
Je souhaite juste que personne de non identifié ne puissent y accéder en
tapant l'adresse directement (donc pas dans un répertoire accessible du
web).
Je souhaite que le fichier pdf ou xls que j'ai mis moi-même mais qui
contient des données confidentielles ne soient accessible uniquement si
la personne s'est bien identifiée au début...

Comment faire ?

Merci
--
Vincent
P'tit Marcel
2007-06-03 14:37:54 UTC
Permalink
Post by Legeais Vincent
Post by P'tit Marcel
tous ces objets inclus en HTML peuvent être stockés dans un/des
répertoires accessibles du web. En général ce sont des objets placés
par le webmaster qui s'assure qu'ils ne sont pas dangereux.
Pour les objets inclus qui ont été uploadés par un autre utilisateur
[...]
Mon problème n'est pas la dangerosité des fichiers.
Je souhaite juste que personne de non identifié ne puissent y accéder en
tapant l'adresse directement (donc pas dans un répertoire accessible du
web). Je souhaite que le fichier pdf ou xls que j'ai mis moi-même mais qui
contient des données confidentielles ne soient accessible uniquement si
la personne s'est bien identifiée au début...
ça me paraît pas insurmontable.
dans les pages HTML, tu peux mettre des liens genre :
<a href='http://.../objet.php?fichier=classeur.xls'>

et le script objet.php est du genre :

if(utilisateur_authentifie()) {
$fichier = @$_GET['fichier'];
if(!preg_match('`[/\\]`', $fichier) and ($fichier{0} != '.')) {
$fichier_complet = CHEMIN_INCLUS . '/'. $fichier;
if(file_exists($fichier_complet)) {
header('Content-Type: application/octet-stream');
header("Content-Length: ".filesize($fichier_complet));
set_time_limit(0);
if(@readfile($fichier_complet))
exit();
}
else die("erreur à la lecture du fichier $fichier");
}
else die("fichier $fichier non trouvé");
}
else die("fichier $fichier non valide");
}
else {
header('HTTP/1.1 403 Forbidden');
die("accès refusé");
}


Il faudrait aussi positionner le type mime par un autre header(). Pour
récupérer ce type, tu peux programmer une fonction comme le fonction
mimeTypes proposée par Philipp Heckel dans les notes du manuel ici:
http://fr.php.net/readfile


eça
--
P'tit Marcel
stats sur les forums modérés http://www.centrale-lyon.org/ng/
Legeais Vincent
2007-06-03 18:54:03 UTC
Permalink
Post by P'tit Marcel
<a href='http://.../objet.php?fichier=classeur.xls'>
if(utilisateur_authentifie()) {
[...]
Ca me parait bien.
Je vais donc tester cela tranquillement.
Merci
--
Vincent
Legeais Vincent
2007-06-04 21:06:33 UTC
Permalink
Post by P'tit Marcel
header('Content-Type: application/octet-stream');
header("Content-Length: ".filesize($fichier_complet));
readfile($fichier_complet);
Il faudrait aussi positionner le type mime par un autre header().
OK pour le header

Par contre, comme je le dis dans mon message posté à 20hxx en réponse à
celui de Thief13 (qu'il a posté à 11h25 ce jour (04/06/2007)) :
Il y a un problème pour le nom du fichier :
le fichier proposé au téléchargement s'appelle objet.php et nom pas
fichier.ext
Ce qui impose au visiteur de renommer... ce n'est donc pas acceptable...

Comment faire ?

Merci
--
Vincent
Thief13
2007-06-03 15:18:54 UTC
Permalink
Post by P'tit Marcel
Pour les objets inclus qui ont été uploadés par un autre utilisateur
- leur type mime (http://faqfclphp.free.fr/#rub4.10)
cela évite les erreurs mais pas les tentatives malfaisantes
- les premiers caractères du fichier (voir le fil "Controler le type de
fichier envoye par un formulaire" en cours sur ce forum)
- leur suffixe (refuser .php? .js .java etc.)
Controler le mime et le suffixe, ça fait un peut double emplois, car le
mime est déterminé par le suffixe. et c'estplus prise de tete de
controler le suffixe (tous n'ont pas la meme taille, un meme fichier
peut avoir plusieurs suffixe -.jpg et .jpeg par exemple- etc etc)

Perso, grace au fil "Controler le type de fichier envoye par un
formulaire", maintentant, je commence par vérifier que le mime est un
des type accepté, puis je compare le mime à la signature qu'il est sensé
avoir.

Mais là, je pense que le probleme est différent : il veux empecher
l'acces au fichiers qui sont sur le serveur aux personnes non enregistré
il me semble.
Thief13
2007-06-03 15:18:54 UTC
Permalink
Post by Legeais Vincent
appel : <img src='image.php?photo=photo.jpg'>
<?
header("content-type:image-jpeg");
$source = $photo;
$image = imageCreateFromJpeg($source);
imageJpeg($image);
imageDestroy($image);
?>
Est-ce comme cela que toi tu fais ?
Si tu fais autrement, je veux bien savoir comment...
C'est le principe
Post by Legeais Vincent
Par contre ceci ne fonctionne qu'avec les images...
Comment faire pour les sont et les vidéos ?
Et aussi pour les autres fichiers (.css) ?
Et pour un fichier .pdf par exemple ?
Merci
Ca marche avec tout les fichiers : tu met le mime type que tu veux dans
le header
Legeais Vincent
2007-06-03 18:54:03 UTC
Permalink
Post by Thief13
Post by Legeais Vincent
appel : <img src='image.php?photo=photo.jpg'>
<?
header("content-type:image-jpeg");
$source = $photo;
$image = imageCreateFromJpeg($source);
imageJpeg($image);
imageDestroy($image);
?>
[...]
C'est le principe
Post by Legeais Vincent
[...]
Ca marche avec tout les fichiers : tu met le mime type que tu veux dans
le header
Pour le header, je vois.
Mais ensuite je ne vois pas du tout...
Je remplace :

$image = imageCreateFromJpeg($source);
imageJpeg($image);

par quoi ?
Je suppose que ces instructions ne sont valides que pour une image ?
--
Vincent
Thief13
2007-06-04 09:25:58 UTC
Permalink
Post by Legeais Vincent
Pour le header, je vois.
Mais ensuite je ne vois pas du tout...
$image = imageCreateFromJpeg($source);
imageJpeg($image);
par quoi ?
Je suppose que ces instructions ne sont valides que pour une image ?
essaye un truc du genre :

<?php

// test des droit
// si pas bon, exit

$ficher = file_get_contents('repertoirprotege/fichier.xxx');

header("content-type:[mime-type]");

echo $ficher;

?>
Legeais Vincent
2007-06-04 21:06:33 UTC
Permalink
Post by Thief13
<?php
// test des droit
// si pas bon, exit
$ficher = file_get_contents('repertoirprotege/fichier.xxx');
header("content-type:[mime-type]");
echo $ficher;
?>
Mon script appelant :
<a href=lire-fichier.php?fic=fichier.xls>fichier</a>

Le fichier lire-fichier.php :
<?
$fichier = file_get_contents($fic);
header("content-type:application/octet-stream");
echo $fichier;
?>

(le header est-il bon ?
Ca me propose d'ouvrir "lire-fichier.php" avec le bloc note... et donc
je ne vois pas le fichier fichier.xls.
Par contre si j'impose l'ouverture avec Excel, et non pas le bloc note,
alors ça m'ouvre le fichier Excel... sous le nom "lire-fichier-1.php"

Cela n'est donc évidement pas satisfaisant...

...
J'ai essayé d'autres header :
application/excel --> pas mieux
application/x-msexcel --> mieux !!!
En effet ça force à ouvrir avec Excel...
Par contre le nom du fichier est "lire-fichier-1.php.xls" au lieu de
"fichier.xls" à l'ouverture et "lire-fichier-1.php" au téléchargement
(donc perte de l'extension, ce qui est très gênant pour le visiteur...)

Peut-on imposer le nom ?
J'ai essayé de rajouter dans le header : name=\"$fic\" ou
filename=\"$fic\" mais rien n'y fait...

Et surtout :
Cette méthode oblige d'avoir un fichier lire-fichier-excel.php et
lire-fichier-word.php et lire-fichier-xxx.php ...
N'est-il pas possible de tout faire en un ?
(c'est fonction mimeTypes proposée par Philipp Heckel dans les notes du
manuel ici: http://fr.php.net/readfile ?)

Merci
--
Vincent
Thomas Labourdette
2007-06-05 12:01:14 UTC
Permalink
Post by Legeais Vincent
Peut-on imposer le nom ?
J'ai essayé de rajouter dans le header : name=\"$fic\" ou
filename=\"$fic\" mais rien n'y fait...
Pour imposer le nom, tu peux ajouter l'entête :
Content-disposition: "attachment; filename='nom_du_fichier.machin'"

@+
--
Théophile ROUGE (signature et citation aléatoires)
7 semaines : Qu'est-ce que tu veux boire ?
7 mois : Je prendrais bien un Martini
7 ans : T'as encore oublié les glaçons !
Legeais Vincent
2007-06-05 22:01:54 UTC
Permalink
Post by Thomas Labourdette
Post by Legeais Vincent
Peut-on imposer le nom ?
J'ai essayé de rajouter dans le header : name=\"$fic\" ou
filename=\"$fic\" mais rien n'y fait...
Content-disposition: "attachment; filename='nom_du_fichier.machin'"
Merci.
header("Content-disposition:attachment;filename=$fic");
fonctionne, avec $fic le nom de mon fichier

Quand je clic ça ouvre le fenêtre qui demande ouvrir / enregistrer et là
il n'y a pas de problème !

Le seul truc c'est quand je fais un clic droit / enregistrer le lien
sous... car ça enregistre le fichier de script php !!!

Merci à tous pour vos bons conseils
--
Vincent
Olivier Miakinen
2007-06-05 22:49:03 UTC
Permalink
Post by Legeais Vincent
Post by Thomas Labourdette
Post by Legeais Vincent
Peut-on imposer le nom ?
J'ai essayé de rajouter dans le header : name=\"$fic\" ou
filename=\"$fic\" mais rien n'y fait...
Content-disposition: "attachment; filename='nom_du_fichier.machin'"
Merci.
header("Content-disposition:attachment;filename=$fic");
fonctionne, avec $fic le nom de mon fichier
Quand je clic ça ouvre le fenêtre qui demande ouvrir / enregistrer et là
il n'y a pas de problème !
Le seul truc c'est quand je fais un clic droit / enregistrer le lien
sous... car ça enregistre le fichier de script php !!!
1) Que vaut $fic ?
2) Quel est le nom du script PHP ?
3) Avec quel(s) navigateurs(s) as-tu essayé ?
4) Tu as une adresse pour qu'on essaye aussi ?
Legeais Vincent
2007-06-06 14:43:53 UTC
Permalink
Post by Olivier Miakinen
Post by Legeais Vincent
Post by Thomas Labourdette
Post by Legeais Vincent
Peut-on imposer le nom ?
J'ai essayé de rajouter dans le header : name=\"$fic\" ou
filename=\"$fic\" mais rien n'y fait...
Content-disposition: "attachment; filename='nom_du_fichier.machin'"
Merci.
header("Content-disposition:attachment;filename=$fic");
fonctionne, avec $fic le nom de mon fichier
Quand je clic ça ouvre le fenêtre qui demande ouvrir / enregistrer et là
il n'y a pas de problème !
Le seul truc c'est quand je fais un clic droit / enregistrer le lien
sous... car ça enregistre le fichier de script php !!!
1) Que vaut $fic ?
2) Quel est le nom du script PHP ?
3) Avec quel(s) navigateurs(s) as-tu essayé ?
4) Tu as une adresse pour qu'on essaye aussi ?
4) non, car je fais juste un test en local avec easyphp
3) Firefox 1.5
1) et 2) :
J'ai un script lire.php :
<?
<a href=lire-fichier.php?fic=fichier.xls>fichier</a>
?>
Et le script lire-fichier.php :
<?
header('Content-Type: application/x-msexcel');
header("Content-disposition:attachment;filename=$fic");
readfile($fic);
?>
[$fic devrait subir un GET... mais là je suis dans le test donc ce n'est
pas grave...]

Il ne reste plus qu'à rajouter la fonction mimeTypes proposée par
Philipp Heckel dans les notes du manuel ici: http://fr.php.net/readfile
(merci P'tit Marcel) pour que le Content-Type se mette tout seul quelque
soit le type de fichier...

Tout ceci répond parfaitement à mon problème.
Merci
Post by Olivier Miakinen
Le seul truc c'est quand je fais un clic droit / enregistrer le lien
sous... car ça enregistre le fichier de script php !!!
Ce n'était pas un vrai problème mais plutôt une constatation...
Ce comportement est normal puisque le lien dans le fichier lire.php
n'appelle pas directement le fichier fichier.xls mais le fichier
lire-fichier.php et c'est donc lui qui est enregistrer quand on fait
clic droit / enregistrer sous...
Il est vrai que si quelqu'un a une petite astuce pour éviter cela et
faire comme pour un lien href=fichier.xls je suis preneur... (mais ce
n'est pas grave sinon...)
--
Vincent
Legeais Vincent
2007-06-03 18:54:03 UTC
Permalink
Post by Legeais Vincent
Je souhaite faire un site donc l'accès se fera par login et mot de passe
aux seules personnes à qui j'aurai donné des identifiants.
[...]
Le seul problème est pour les fichiers multimédia (images, sons, vidéos).
Comment font les sites du genre banque ou webmail ?
Je suppose que les pièces jointes aux mail lus dans les webmail sont
inaccessibles à tous, sauf le possesseur de l'adresse e-mail ?
Et de même pour les comptes banquaires !

Est-ce la technique que P'tit Marcel ou Thief13 propose ?
--
Vincent
Mihamina Rakotomandimby (R12y)
2007-06-04 09:25:58 UTC
Permalink
Post by Legeais Vincent
Post by Legeais Vincent
Je souhaite faire un site donc l'accès se fera par login et mot de passe
aux seules personnes à qui j'aurai donné des identifiants.
[...]
Le seul problème est pour les fichiers multimédia (images, sons, vidéos).
Comment font les sites du genre banque ou webmail ?
Je suppose que les pièces jointes aux mail lus dans les webmail sont
inaccessibles à tous, sauf le possesseur de l'adresse e-mail ?
Et de même pour les comptes banquaires !
Je fait suivre sur un groupe plus adapté: fr.comp.infosystemes.www.serveurs.
D'abord, pour les mail et tout ça, il y a souvent un serveur IMAP entre les
mails+PJ et le serveur Web.
Continuer la lecture sur narkive:
Loading...