Vérification comment déceler les failles

Vérification comment déceler les failles - PHP - Programmation

Marsh Posté le 13-03-2007 à 19:35:23    

Bonjour a tous
 
Voila cela fait un moment que je bricole en php au point de pouvoir faire des site de type portail. Je ne suis pas un pro, j'ai appris tout seul donc doit surement y avoir des methodes et des codes que j'utilise d'une manière et qui serait mieu d'une autres etc...
 
J'aurais bientot une formation de developpeur digne de ce nom, je pense que cela me permettra d'avoir des bases solides mais en attendant je me pose une question.
 
Une fois nos code achevé et fonctionnel après divers phase de test, comment décelé les failles de sécurité par exemple? Je ne suis pas du tout hacker et connais nullement les méthodes et j'aimerais pouvoir dire que mon site est sécurisé (ne serait qu'un minimum)
 
merci par avance pour vos conseils futur

Reply

Marsh Posté le 13-03-2007 à 19:35:23   

Reply

Marsh Posté le 14-03-2007 à 09:23:16    

pas évident d'avoir du 100 % sécurisé, ça dépend de beaucoup de choses : code, config php, config serveur...
 
coté code :
- éviter les notices (développer avec l'affichage de toutes les erreurs...)
- vérifier les requêtes sql (utiliser mysql_[real_]escape_string ou autres, et toujours mettre des guillemets pour les valeurs de champs...)
- vérifier les includes/require (attention par exemple à un include($page)...)
- attention utilisation eval
- attention utilisation option e avec PCRE
...etc
 
coté serveur prod :
- Serveur à jour, surveiller les alertes de sécurité (frsirt.com par exemple)
- PHP : désactiver l'affichage des erreurs php
- Apache : désactiver l'affichage de l'index (Options Indexes dans httpd.conf)
- Système : mettre les bons droits sur les bons fichiers
...etc
 
Je ne suis pas un spécialiste donc la liste n'est pas exhaustive...

Reply

Marsh Posté le 14-03-2007 à 09:36:23    

2 anecdotes concernant des failles récentes sur des sites assez connus :
 
- copainsdavant.com : cette semaine un étudiant surfait sur ce site et tombe sur une page d'erreur... c'était aussi une page de debuggage apparemment, on pouvait lire un print_r de la config avec bcp de détails comme le mot de passe (pour serveur bd) en clair...etc
 
- viewsurf-attitude.com : il y a quelques semaines je tombe sur un message d'erreur php, dans ce message je vois qu'il y a un dossier gestion... je vais donc voir dans ce dossier et comme apache est mal configuré j'ai pu voir la liste de tous les fichiers, notamment des fichiers backup qui n'ont pas l'extension php... j'ai ainsi pu obtenir login/pass pour la bd, et j'ai pu me connecter avec ce même login/pass au serveur (ftp et ssh), un serveur qui héberge pas mal d'autres sites... (la faille est corrigée depuis).
donc un autre conseil concernant cet exemple : utiliser des login/pass différents pour bd/ftp/ssh...

Reply

Marsh Posté le 14-03-2007 à 09:55:36    

oki merci cela fait deja quelque vérification a faire :)
 
Et vous allez me dire si c'est bon pas, mais par exemple dans ce que je fais j'ai pages qui s'affiche avec .....php?id=2 par exemple cela dit jai fait un bout de code qui vérifie l'id (enfin l'existence de la variable) de ce fait en cas de saisie d'une url non valide je nao pas d'ereur php a l'ecran mais je fait une redirection vers la page erreur.php  ou alors un petit message de ma part avec un bouton retour
 
est ce que c'est bon comme système ?

Reply

Marsh Posté le 14-03-2007 à 10:24:43    

penses aussi à utiliser strip_tags() sur les champs textes de tes formulaires quand tu les traites côté serveur.

Reply

Marsh Posté le 14-03-2007 à 10:26:32    

cela sert a quoi? ce champs ? enfin non laisse vais chercher ;)
en tout cas merci de vos aide :)

Reply

Marsh Posté le 14-03-2007 à 10:31:55    

Donc en gros cela permet d'inserer des balise html et de l'ai traiter en cas d'appel de la variable
voir egalement de permettre l'affichage de la balise que l'on aura désigné en parametre c'est ca ?
 
qu'elle est le but de cette action? Enfin moi cela m'interesse puisque c'est ce que je cherche pouvoir mettre des balise html en bdd et lors de son apel dans la page que ces balise soit exécuté :)
c'est sécurisé de faire ca ?

Reply

Marsh Posté le 14-03-2007 à 10:41:31    

non, c'est tout le contraire.
Imagines que dans un champ <input name="toto" type="text" /> l'utilisateur saisisse "<b>Coucou</b>". Si côté serveur tu récupères cette valeur dans une variable $MaVar = $_POST['toto']; et que tu fais un echo $MaVar; le code html va être interprété.
Dans mon ex, ce n'est pas grave mais imagine qu'il y ait à la place <script type="text/javascript" src="..."></script>, ça peut être plus génant!
en faisant $MaVar = strip_tags($_POST['toto']); tu vires toutes les balises html. Par ailleurs, y'a moyen de ne virer que certaines balises et pas toutes ;)

Reply

Marsh Posté le 14-03-2007 à 10:49:02    

Oki je comrpend mieu :)
donc on peu virer toute les balise sont les balise de mise en forme tel que <u> <i> <b> etc... en effet ca sécurise quand meme pas mal :)
 
Merci du truc
 
reste qu'il faut que je vire donc mon htmlspecialchar qui ne servira plus a rien du coup j'imagine?

Reply

Marsh Posté le 14-03-2007 à 10:54:00    

soju a écrit :

- éviter les notices (développer avec l'affichage de toutes les erreurs...)


 :jap:

soju a écrit :

- vérifier les requêtes sql (utiliser mysql_[real_]escape_string ou autres, et toujours mettre des guillemets pour les valeurs de champs...)


 :non: En PHP4 ok, en PHP5 toujours utiliser les prepared statements (PDO et mysqli), ne jamais faire d'inférence manuelle, toujours utiliser les placeholders :o

soju a écrit :

- vérifier les includes/require (attention par exemple à un include($page)...)


 :non: Ne jamais effectuer un include/require contenant des données venant de l'utilisateur (utiliser un dispatcher par exemple)

soju a écrit :

- attention utilisation eval


Ne jamais utiliser eval, sapu :o

 

Et j'ajouterais:

  • Ne jamais utiliser register_global et vérifier que cette daube est désactivée
  • Ne jamais se reposer sur les magic_quotes et vérifier qu'elles sont désactivées
  • Eviter de créer des fichiers/dossiers avec des noms donnés par les utilisateurs (mieux vaut générer soi même les noms "réels", et créer un mapping entres les noms utilisateurs et les noms réels)
  • Toujours vérifier et valider les données utilisateurs du côté du serveur: il est trivial de bypasser une vérification en Javascript (ça prend environ 5s avec Firefox et les extensions kivonbien), toute vérification côté client doit être ajoutée en redondance côté serveur, en étant au moins aussi stricte sinon plus
  • Songer à l'utilisation d'open_basedir
  • Désactiver le fopen sur les fichiers distants
  • Activer safe_mode
soju a écrit :

- Serveur à jour, surveiller les alertes de sécurité (frsirt.com par exemple)


Et utiliser Hardened PHP si possible (en dev comme en prod)

soju a écrit :

- Système : mettre les bons droits sur les bons fichiers


 :jap: PHP est soumis aux droits du système, veiller donc à ce que l'utilisateur sous lequel PHP tourne (créer un utilisateur spécifique dans un groupe spécifique) n'ait accès qu'aux fichier/répertoires concernant les scripts et surtout pas au reste, attention ceci ne dispense pas de ne jamais utiliser directement des données utilisateur dans les includes/requires

 

Et j'ajouterais:

  • Conserver une trace des erreurs afin de pouvoir les analyser par la suite

Accessoirement, I Love Jack Daniels a une série de posts sur Writing Secure PHP relativement correcte, je conseille de la lire les infos sont bonnes.


Message édité par masklinn le 14-03-2007 à 10:55:04

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 14-03-2007 à 10:54:00   

Reply

Marsh Posté le 14-03-2007 à 15:43:09    

Faut pas trop t'inquieter et etre logique.
 
Selon le degre de criticité de l'app tu fais les modifs necessaires.
 
La t'as eut des reponses claires, dans tous les cas il faudra identifier les besoins et repondre en consequence.
 
Tout savoir c'est bien mais ca ne fait pas manger.
 

Reply

Marsh Posté le 14-03-2007 à 17:34:26    

Oui mais non ^^ la deja vais appliqué le strip_tag ce sera deja bien ensuite des chmod sur fichier et dossier biensur ^^
pour les include  et require c'est toujours avec une page donné pas d'info dynamique donc ca roule
 
vais mettre en pratique plus ou moins ce qui a ete dit deja :)
 
merci a tous

Reply

Marsh Posté le 16-03-2007 à 15:19:12    

rufo a écrit :

non, c'est tout le contraire.
Imagines que dans un champ <input name="toto" type="text" /> l'utilisateur saisisse "<b>Coucou</b>". Si côté serveur tu récupères cette valeur dans une variable $MaVar = $_POST['toto']; et que tu fais un echo $MaVar; le code html va être interprété.
Dans mon ex, ce n'est pas grave mais imagine qu'il y ait à la place <script type="text/javascript" src="..."></script>, ça peut être plus génant!
en faisant $MaVar = strip_tags($_POST['toto']); tu vires toutes les balises html. Par ailleurs, y'a moyen de ne virer que certaines balises et pas toutes ;)


 
et si jamais je rentre <scr<script>ipt type="text/javascript" ....> ton strip tags me le détexte ?
Meilleure solution : htmlentities ... Il code les < et > en entités HTML => &lt; ainsi que &gt;.

Reply

Marsh Posté le 16-03-2007 à 15:32:13    

pour simplifier, je fais un htmlentities(strip_tags($Var));
Mais suivant les besoins, je suis amené à effectuer d'autres filtrages/transformations de caractères de ma chaîne donnée en entrée...

Reply

Marsh Posté le 16-03-2007 à 15:39:07    

petit question con je suppose mais
 
avant l'ajout en bdd je fais ca  
 

Code :
  1. $descriptif1 = htmlspecialchars($descriptif,ENT_QUOTES);
  2.           $descriptif2=ereg_replace(chr(13),'<br>',$descriptif1);


 
je suppose que le htmlspecial char c pour virer les balise ?
 
sinon lorsque je rapel les info une fois enregistrer et bien par exemple lors d'un saut de ligne j'ai la balise <br> qui apparait (en plus du saut de ligne réel) comme corriger cela ?

Reply

Marsh Posté le 16-03-2007 à 15:41:56    

faut faire les transfos inverses. Par ailleurs, je pense qu'un str_replace ou un preg_replace serait moins lourd qu'un ereg_replace

Reply

Marsh Posté le 16-03-2007 à 15:44:20    

excuse moi je suis un peu neophite sur les commande qu eje connais pas :(
 
pourrait tu m'indiqué la syntaxe pour remplacé ceci?
 
sinon le HTMLspecialchar tel que je lai mis servirai a quoi? je ne sai splus lol honte a moi je sais qu eje l'ai mis car cas inverse cela posait probleme mais je sais plus?
 
Car en fait j'aimerais pouvoir inclure en bdd la mise en forme de texte saisie genre les balise <b> <i> <u> etc... et qu'elle s'exécute lors du rapel des infos

Reply

Marsh Posté le 16-03-2007 à 15:51:20    

pour la syntaxe de ces commandes => www.php.net

Reply

Marsh Posté le 16-03-2007 à 15:52:03    

rufo a écrit :

pour la syntaxe de ces commandes => www.php.net


 
comme dit précédemment, strip_tags peut laisser filtrer les balises que tu mentionnes.

Reply

Marsh Posté le 23-03-2007 à 16:02:49    

Bon j'ai essayé d'appliqué ce que l'on ma dit :( mais sa marche pas
 

Code :
  1. $descriptif1 = htmlentities(strip_tags($news_descript, '<b>'));
  2. $descriptif2 = str_replace(chr(13),'<br>',$descriptif1);


 
donc j'ai mis un str_replace a la place du ereg replace c'est ok ca fonctionne
j'ai mis un htmlentities(strip_tags a la place de l'autre htmlspécialchar et donc ca fonctionne seul les balise <b> passe les autres sont automatiquement détruite dans la chaine
 
cela dit quand je rapel les info en bdd il m'affiche les balise mais ne les execute pas
 
genre j'ai <b>texte</b> au lien de texte
 
Dans la bdd les <b> sont affiché comme ca : &lt;b&gt;
 
une idée ?


Message édité par hyptnos le 23-03-2007 à 16:09:46
Reply

Marsh Posté le 23-03-2007 à 17:10:12    

les balises que tu mets dans strip_tags, ce sont celles à garder, c'est normal donc. Faut lire la doc!

Reply

Marsh Posté le 23-03-2007 à 17:27:08    

Bas justement j'avais garder que B or lors de l'affichage il m'affichait les balise et non pas l'execution mais ca c'est régler
c'est bon j'ai maitrise la bete avec les balise ;)
 
sinon la jai une autre souci  
j'ai créer une variable $chaine oui j'ai mise toute les balise que je souhaite concerve ( "<b><i><u><a>" )
 
tout fonctionne bien sauf avec le <a href> en effet le lien s'affiche bien
mais si je fait par exemple un <a href="www.hardware.fr">Hardware.fr</a>
 
il m'execute ceci : http://hyptnos.blogdns.net/JapanArts/www.hardware.fr
 
mon site plus le lien pourquoi
 
De plus je comprend pas pourquoi la balise <h1> par exemple n'est pas filtrer alors que je ne la veux pas


Message édité par hyptnos le 23-03-2007 à 17:28:52
Reply

Marsh Posté le 23-03-2007 à 18:03:37    

faut mettre http:// devant www :o

Message cité 1 fois
Message édité par rufo le 23-03-2007 à 18:06:44
Reply

Marsh Posté le 23-03-2007 à 18:05:37    

rufo a écrit :

je connaissais le hack du // mais pas du _. Merci :jap:


 
???
 
Quoi ???
 
sinon personne pour ma question? d'ailleur je peux meme y mettre des balise <img> :(
ca filtre pas vraiment :(

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed