| PHP sécurite | |
|
|
Auteur | Message |
---|
arthuro Utilisateur confirmé: Rang ****
Messages : 1483 Localisation : Paris Projet Actuel : Diagon https://arthursonzogni.com/Diagon
| Sujet: PHP sécurite Jeu 6 Jan 2011 - 19:22 | |
| J'ai des sites hébergée chez free. Je m'en sert d'un pour faire un uploadeur perso. J'ai fait ce qu'il faut pour faire l'uploadeur ainsi qu'un mot de passe pour que personne ne vient ajouter des fichiers dessus (ormis moi quand j'en ai besoin) Et j'ai fait deux zone pour télécharger ce qui est déposé une zone public(visible par tous le monde) et une zone privée(visible en entrant un mot de passe).
maintenant que tous marche, je me pose quelque question. J'ai stocker les mot de passe directement dans les fichiers php, est-il possible que quelqu'un puisse les récupéré en clair (le fichier php, pas le résultat qu'en fait l'interpréteur php) Aussi, j'ai stocker les fichiers dans 2 répertoire, /document/ et /documentPrive/, il suffit donc a un visiteur de lire le lien que je donne pour télécharger, et ne garder le chemin que jusqu'au dossier et ainsi explorer tous le dossier sans permission. Est-il possible d'empêcher cela? Esque mettre un fichier index.html dans ces dossier est une bonne solution pour les masquer ? |
|
| |
M@d_Doc Modérateur
Messages : 6600 Localisation : 47°44'8.04 Projet Actuel : aucun
| Sujet: Re: PHP sécurite Jeu 6 Jan 2011 - 20:47 | |
| un mot de passe ne se stocke pas dans un fichier php!!! Normalement, tu mets ça dans une base de donnée, le tout crypté en md5 (suffit d'utiliser la commande md5(string), c'est rien de bien sorcier).
Ensuite, le coup de l'index, c'est une fois de plus un tour de passe passe sans grande valeur. Quelqu'un qui tiens à tout retrouver ne devrait pas avoir de mal même sans s'y connaitre vraiment.
Mais dis moi, en tant qu'admin de ton ftp, tu n'es pas sensé pouvoir régler l'accès (wwrrxx et tout ça) de tes fichiers? voir directement proposer plusieurs profils?
Je connais pas le ftp de chez free, mais ça m'étonnerai qu'il soit si vide... Je suis presque sûr qu'il y a un moyen intégré pour restreindre l'accès des différents fichiers |
|
| |
master47 Utilisateur confirmé: Rang *****
Messages : 2368 Projet Actuel :
-------------------
> PacWars
> The Perfect Pattern Studio
| Sujet: Re: PHP sécurite Jeu 6 Jan 2011 - 21:27 | |
| ya plusieurs solutions : - T'as le mySQL qui est une solution pas mauvaise, mais alors il faut pas oublier les mysql_escape_string() et htmlentities(). - Tu peux stocker tes mots de passes dans un fichier texte sur ton hebergeur mais alors n'oublie pas de définir les droits d'accès en lecture et ecriture afin qu'on ne puisse y accéder qu'en local.
mais dans les deux cas tu dois hasher ton mdp. De préférence en sha256 ou quoi car le md5 n'est plus totalement sécu. |
|
| |
Gab666 Modérateur 'Zut'
Messages : 5340 Localisation : **I move away from the mic to breathe in
| Sujet: Re: PHP sécurite Ven 7 Jan 2011 - 0:14 | |
| - Citation :
- - Tu peux stocker tes mots de passes dans un fichier texte sur ton hebergeur mais alors n'oublie pas de définir les droits d'accès en lecture et ecriture afin qu'on ne puisse y accéder qu'en local.
Il n'y a pas que ça, si apache a accès à ton fichier un utilisateur pourrait simplement aller le voir en y accédant exemple (localhost/motsdepasses/mdp.txt). T'as deux solutions, tu le met à l'extérieur de ton web root ou encore mieux, tu le protèges avec un .htaccess qui fait un deny from all. À partir de là il n'y a qu'à partir de la machine qu'on peut accéder au fichier, là il suffit de hasher le mot de passe(avec md5 ou sha1) et en passant pour ceux qui ne le savent pas, un hash c'est incrackable, la façon dont les gens s'y prennent pour trouver les mots correspondant à un hash c'est avec une large base de données et un peu de social engineering et/ou avec un algorithme pourtrouver les collisions qui prend probablement des semaines à s'exécuter. L'avantage avec SHA en PHP c'est que les constantes utilisées dépendent du matériel de la machine qui exécute le script, donc elles ne sont pas à la portée de n'importe quel reverse engineer. Le désavantage de ça c'est que si tu changes d'hébergeur ou de serveur, dis adieu aux mots de passes. Tu peux toujours utiliser SHA-1 et pas changer de serveur ou encore utiliser md5 avec un grain de sel et t'assurer d'être presque impossible à cracker en plus d'être sûr que l'output ne dépende pas de la machine. Pour protéger l'accès aux fichiers t'as deux solutions: un .htpasswd qui contient ton mot de passe ou si tu veux quelque chose de plus élégant j'ai déjà fait une page qui détermine selon la variable $_SESSION si t'as le droit d'accès au fichier. Ensuite le contenu de la page est changé pour ça et dans le header http on donne le nom du fichier, donc ça devrait prompter l'écran de save as sauf si t'as pas un plugin dans ton browser qui te permet de le lire. N'oublis surtout pas de placer un .htaccess qui fait un deny from all dans ton fichier. Code original: - Code:
-
<?php
$configFile = "\\private\\configs.xml";
if(!file_exists(getcwd().$configFile)||!($xmlConfigs = simplexml_load_file(getcwd().$configFile))) { die('Error in file: '.getcwd().$configFile); }
if(!isset($xmlConfigs->mysql->host)) linedDie("configs->mysql->host not found",__LINE__); if(!isset($xmlConfigs->mysql->user)) linedDie("configs->mysql->user not found",__LINE__); if(!isset($xmlConfigs->mysql->password)) linedDie("configs->mysql->password not found",__LINE__);
$globalSql = mysql_connect($xmlConfigs->mysql->host, $xmlConfigs->mysql->user, $xmlConfigs->mysql->password) or linedDie("Error mysql_connect", __LINE__); mysql_select_db($xmlConfigs->mysql->database, $globalSql) or linedDie("Error mysql_select_db",__LINE__);
session_start(); include("setroles.php"); include("utils.php");
if(isset($_GET['getfile'])) { $result = mysql_query("SELECT * FROM files WHERE id='".mysql_real_escape_string($_GET['getfile'])."'"); if($data=mysql_fetch_assoc($result)) { if(hasRole("ADMIN")||hasProject($data['fk_contractID'])||isContactFor($data['fk_contractID'])) { header('Content-Disposition: attachment; filename="'.$data['filename'].'"'); echo file_get_contents($data['filepath']); } } } ?> Ou simplifié, mais fais attention ce code contient beaucoup de failles. Tu dois absolument stocker le chemin des fichiers uploadé dans une base de données ou du moins quelque part pour garder la trace et valider si le fichier qui est accédé en fait parti, sinon attends toi à de mauvaises surprises. - Code:
-
<?php if(isset($_GET['file'])) { if(/*Condition d'accès*/) { header('Content-Disposition: attachment; filename="'.basename($_GET['file']).'"'); echo file_get_contents($_GET['file']); }
} ?>
Il ne doit avoir aucun autre contenu dans la page, n'oublis pas, |
|
| |
arthuro Utilisateur confirmé: Rang ****
Messages : 1483 Localisation : Paris Projet Actuel : Diagon https://arthursonzogni.com/Diagon
| Sujet: Re: PHP sécurite Dim 9 Jan 2011 - 20:44 | |
| Merci a tous pour vaut réponse.
Il ne me semble pas pouvoir changer les permission des fichier et dossier J'ai essayer avec filezilla. J'obtient: Commande : SITE CHMOD 740 filetool Réponse : 500 'SITE': command unrecognized.
Je vais essayer de stocker le mot de passe crypté sur la bdd, c'est une solution qui est à ma portée. Pour le reste, j'avoue ne pas avoir l'expérience nécessaire pour bien comprendre certaines solutions. Je vais mettre ça en place, puis apprendre encore un peu pour essayer le reste.
|
|
| |
Invité Invité
| Sujet: Re: PHP sécurite Dim 9 Jan 2011 - 21:08 | |
| - M@d_Doc a écrit:
- Un mot de passe ne se stocke pas dans un fichier php!!!
Normalement, tu mets ça dans une base de donnée, le tout crypté en md5 (suffit d'utiliser la commande md5(string), c'est rien de bien sorcier). On peut stocker un mot de passe dans un fichier PHP sans problèmes (faut juste pas l'afficher). Le coup du MD5, faut savoir qu'on peut, non pas le décrypter, mais trouver la combinaison en clair du cryptage grâce aux nombreux sites de décryptage MD5. http://www.google.ch/#hl=fr&biw=1024&bih=485&q=md5+decrypt&aq=f&aqi=g10&aql=&oq=&gs_rfai=&fp=34bdeb73e7ee072a |
|
| |
master47 Utilisateur confirmé: Rang *****
Messages : 2368 Projet Actuel :
-------------------
> PacWars
> The Perfect Pattern Studio
| Sujet: Re: PHP sécurite Lun 10 Jan 2011 - 10:46 | |
| tout n'est pas decryptable non plus en md5. sinon tape un htaccess c'est le plus simple |
|
| |
daminetreg Administrateur
Messages : 16998 Localisation : Siege du CBNA! Projet Actuel : Site Web du CBNA, version beta :
| Sujet: Re: PHP sécurite Lun 10 Jan 2011 - 16:48 | |
| Il serait sympathique que tu n'utilise pas md5 seul comme l'a dit Fresh. Je te conseille vivement de laisser tes mots de passes dans tes fichiers php mais hashés en md5 + sha256 par exemple, tu peux aussi rajouter un grain de sel, mais ça devrait suffire, car la combinaison des deux fait qu'il y a peu de chance que ton mot de passe soit dans un dictionnaire sha. Pour hasher en sha256 + md5 tu peux faire ainsi: - Code:
-
hash('sha256', md5($myPassword)); Le coup du mot de passe dans la base de données ou dans un fichier c'est quand même sacrément plus propre, mais pour ton utilisation personnelle tu n'as pas besoin de faire ça, par contre pédagogiquement c'est intéressant aussi. Et puis ça ne prend pas tellement de temps. |
|
| |
arthuro Utilisateur confirmé: Rang ****
Messages : 1483 Localisation : Paris Projet Actuel : Diagon https://arthursonzogni.com/Diagon
| Sujet: Re: PHP sécurite Lun 10 Jan 2011 - 20:09 | |
| Merci beaucoup J'ai essayer la fonction hash Malheureusement sur free, le serveur tourne sous PHP 4.4.3 J'ai cherché, j'ai trouvé la fonction sha1 pour PHP4 Sinon, je me demandait comment rendre mon dossier Privé, réellement privée Car la il suffit d'aller dans /documentPrive/ Et hop, on choisit son fichier. Des idées ? |
|
| |
daminetreg Administrateur
Messages : 16998 Localisation : Siege du CBNA! Projet Actuel : Site Web du CBNA, version beta :
| Sujet: Re: PHP sécurite Lun 10 Jan 2011 - 23:36 | |
| - arthuro a écrit:
- Merci beaucoup
J'ai essayer la fonction hash Malheureusement sur free, le serveur tourne sous PHP 4.4.3 J'ai cherché, j'ai trouvé la fonction sha1 pour PHP4
Sinon, je me demandait comment rendre mon dossier Privé, réellement privée Car la il suffit d'aller dans /documentPrive/ Et hop, on choisit son fichier.
Des idées ? Tu as plusieurs solutions, soit tu mets un .htaccess qui demande une authentification (je sais pas comment free les autorise, il se peut qu'il y ait une limitation en nombre de .htaccess), soit tu mets un .htaccess qui bloque l'accès via http au dossier, mais toi tu fais un script php qui lit "byte par byte" le fichier et qui le retransmet à ton utilisateur, tu risques toutefois d'être gêné par les temps d'exécution restreint du php.ini de free. Donc la meilleure solution est la plus simple: une authentication Http Basic Auth avec un .htaccess: - Code:
-
AuthUserFile .htpasswd AuthGroupFile /dev/null AuthName "Arthuro's Server" AuthType Basic
require valid-user Puis le pour créér .htpasswd il te faut exécuter la commande: htpasswd -c .htpasswd arthuroCela est disponible sur un linux avec apache d'installé, il gènère un fichier avec à chaque ligne un nom d'utilisateur suivi de : et du mot de passe crypté avec "crypt()" ou en md5 avec le grain de sel de apache. Sur windows tu peux télécharger le programme suivant: http://lecbna.org/sys_lecbna/softwares/htpasswd.exeEnsuite tu ouvres une invite de commande: Windows + R > cmd > chdir "path/to/htpasswd.exe", puis tu tapes la commande donnée plus haut. Maintenant que tu as ton .htaccess et ton .htpasswd dans le dossier que tu veux protéger et c'est gagné. Pour la culture: les .htaccess sont des fichiers de configurations qui sont chargés spécialements pour des sous dossiers du serveur web, ce serait étrange que free ne les accepte pas. Cela fonctionnera normalement car free utilise Apache comme serveur, dans le cas d'un lighttpd il existe des équivalences qu'on trouve facilement sur google, mais ça ne répondrai pas à ton cas. |
|
| |
arthuro Utilisateur confirmé: Rang ****
Messages : 1483 Localisation : Paris Projet Actuel : Diagon https://arthursonzogni.com/Diagon
| Sujet: Re: PHP sécurite Mar 11 Jan 2011 - 0:11 | |
| Oui merci, Je connaissais déjà les .htaccess ça marche chez free. Oui c'est peut-être l'unique solution que je peut me permettre. Mais je suppose qu'on ne peux pas demander un fichier dans un .htaccess sans avoir le prompt qui nous demande le mot de passe. Genre, le script php récupère le mot de passe et l'envoie au prompt sans qu'il ne s'ouvre ? Je ne pense pas, mais je peux toujours rêver. |
|
| |
daminetreg Administrateur
Messages : 16998 Localisation : Siege du CBNA! Projet Actuel : Site Web du CBNA, version beta :
| Sujet: Re: PHP sécurite Mar 11 Jan 2011 - 0:25 | |
| - arthuro a écrit:
- Oui merci,
Je connaissais déjà les .htaccess ça marche chez free.
Oui c'est peut-être l'unique solution que je peut me permettre. Mais je suppose qu'on ne peux pas demander un fichier dans un .htaccess sans avoir le prompt qui nous demande le mot de passe. Genre, le script php récupère le mot de passe et l'envoie au prompt sans qu'il ne s'ouvre ? Je ne pense pas, mais je peux toujours rêver. Tout est possible en programmation. Mais c'est plus gourmant, tu empêches l'accès au dossier de tes fichiers depuis le web. Ensuites tu retransmets tes fichiers en php ainsi: - Code:
-
$name = "nomdefichier.zip"; $download = "dossierPriver/fichier12457.zip"; $size = filesize($download);
header('Content-Transfer-Encoding: binary'); header("Content-Type: application/octet-stream"); header('Content-Disposition: attachment; filename="' . $name . '"'); header('Content-Length:' . $size . ''); readfile($download); |
|
| |
Gab666 Modérateur 'Zut'
Messages : 5340 Localisation : **I move away from the mic to breathe in
| Sujet: Re: PHP sécurite Mar 11 Jan 2011 - 0:36 | |
| - arthuro a écrit:
- Oui merci,
Je connaissais déjà les .htaccess ça marche chez free.
Oui c'est peut-être l'unique solution que je peut me permettre. Mais je suppose qu'on ne peux pas demander un fichier dans un .htaccess sans avoir le prompt qui nous demande le mot de passe. Genre, le script php récupère le mot de passe et l'envoie au prompt sans qu'il ne s'ouvre ? Je ne pense pas, mais je peux toujours rêver. Et je me cite: - Gab666 a écrit:
- Pour protéger l'accès aux fichiers t'as deux solutions: un .htpasswd qui contient ton mot de passe ou si tu veux quelque chose de plus élégant j'ai déjà fait une page qui détermine selon la variable $_SESSION si t'as le droit d'accès au fichier. Ensuite le contenu de la page est changé pour ça et dans le header http on donne le nom du fichier, donc ça devrait prompter l'écran de save as sauf si t'as pas un plugin dans ton browser qui te permet de le lire. N'oublis surtout pas de placer un .htaccess qui fait un deny from all dans ton fichier.
Code original: - Code:
-
<?php
$configFile = "\\private\\configs.xml";
if(!file_exists(getcwd().$configFile)||!($xmlConfigs = simplexml_load_file(getcwd().$configFile))) { die('Error in file: '.getcwd().$configFile); }
if(!isset($xmlConfigs->mysql->host)) linedDie("configs->mysql->host not found",__LINE__); if(!isset($xmlConfigs->mysql->user)) linedDie("configs->mysql->user not found",__LINE__); if(!isset($xmlConfigs->mysql->password)) linedDie("configs->mysql->password not found",__LINE__);
$globalSql = mysql_connect($xmlConfigs->mysql->host, $xmlConfigs->mysql->user, $xmlConfigs->mysql->password) or linedDie("Error mysql_connect", __LINE__); mysql_select_db($xmlConfigs->mysql->database, $globalSql) or linedDie("Error mysql_select_db",__LINE__);
session_start(); include("setroles.php"); include("utils.php");
if(isset($_GET['getfile'])) { $result = mysql_query("SELECT * FROM files WHERE id='".mysql_real_escape_string($_GET['getfile'])."'"); if($data=mysql_fetch_assoc($result)) { if(hasRole("ADMIN")||hasProject($data['fk_contractID'])||isContactFor($data['fk_contractID'])) { header('Content-Disposition: attachment; filename="'.$data['filename'].'"'); echo file_get_contents($data['filepath']); } } } ?> Ou simplifié, mais fais attention ce code contient beaucoup de failles. Tu dois absolument stocker le chemin des fichiers uploadé dans une base de données ou du moins quelque part pour garder la trace et valider si le fichier qui est accédé en fait parti, sinon attends toi à de mauvaises surprises. - Code:
-
<?php if(isset($_GET['file'])) { if(/*Condition d'accès*/) { header('Content-Disposition: attachment; filename="'.basename($_GET['file']).'"'); echo file_get_contents($_GET['file']); }
} ?>
Il ne doit avoir aucun autre contenu dans la page, n'oublis pas, Je vais même le faire pour toi - Code:
-
if(isset($_GET['file'])) { $repertoireSource = "DossierPrive/"; $fileExists = false; $dir = scandir($repertoireSource); foreach($dir as $file) { if(strtoupper($file)==strtoupper($_GET['file'])) $fileExists = true; } $aDroit = /*Insérez votre code ici*/;
if($fileExists&&$aDroit) { //Comme dam a ajouté header('Content-Transfer-Encoding: binary'); header("Content-Type: application/octet-stream"); header('Content-Disposition: attachment; filename="'.basename($_GET['file']).'"'); //Je savais même pas que readfile existait readfile($repertoireSource.$_GET['file']); } }
|
|
| |
daminetreg Administrateur
Messages : 16998 Localisation : Siege du CBNA! Projet Actuel : Site Web du CBNA, version beta :
| Sujet: Re: PHP sécurite Mar 11 Jan 2011 - 9:21 | |
| Désolé Gab j'avais pas vu que t'avais déjà donné la solution. |
|
| |
Gab666 Modérateur 'Zut'
Messages : 5340 Localisation : **I move away from the mic to breathe in
| Sujet: Re: PHP sécurite Mar 11 Jan 2011 - 13:07 | |
| - daminetreg a écrit:
- Désolé Gab j'avais pas vu que t'avais déjà donné la solution.
Bah c'est pas grave, plus on en a, mieux c'est! De toute façon je découvre des nouveaux trucs aussi en lisant ta solution. |
|
| |
arthuro Utilisateur confirmé: Rang ****
Messages : 1483 Localisation : Paris Projet Actuel : Diagon https://arthursonzogni.com/Diagon
| Sujet: Re: PHP sécurite Mer 12 Jan 2011 - 12:44 | |
| Merci bien, désolé, j'avais pas bien compris. J'essaye de le mettre en place, mais il y a plusieurs fonctions incompatible PHP 4.4.3, j'essaye de trouver des équivalents. Merci |
|
| |
master47 Utilisateur confirmé: Rang *****
Messages : 2368 Projet Actuel :
-------------------
> PacWars
> The Perfect Pattern Studio
| Sujet: Re: PHP sécurite Mer 12 Jan 2011 - 13:00 | |
| Moi je me souviens avoir utilisé des fichiers dans le passé avec un .htaccess avec comme autorisations d'accès "Deny From All", du coup seul mes scripts avaient accès aux mots de passe hashés. Rien besoin de plus a part ca. |
|
| |
arthuro Utilisateur confirmé: Rang ****
Messages : 1483 Localisation : Paris Projet Actuel : Diagon https://arthursonzogni.com/Diagon
| Sujet: Re: PHP sécurite Mer 12 Jan 2011 - 13:04 | |
| Oui mais tes script, il était appelé depuis d'autre script en dehors de ce dossiers ? |
|
| |
Contenu sponsorisé
| Sujet: Re: PHP sécurite | |
| |
|
| |
| PHP sécurite | |
|