Ce code est-il sécurisé ?

Ce code est-il sécurisé ? - PHP - Programmation

Marsh Posté le 24-09-2006 à 04:03:40    

Bonjour, je me suis lancé dans la prog web (j'ai horreur de ça mais c'est surement parceque je manque cruellement de pratique, pour être franc je me suis lancé dans une petite gestion d'utilisateurs, pour mettre un peu les mains dans le cambouis :)
Ca marche, par contre je me demande si c'est vraiment sécurisé ?
 
En gros l'utilisateur se connecte sur une page où il fournit son identifiant et mot de passe, puis il arrive ici :

Code :
  1. <?php session_start();
  2. include("config_sql.php" );
  3. mysql_connect($DBhost, $DBusr, $DBpwd);
  4. mysql_select_db($DB);
  5. $retour = mysql_query('SELECT pass FROM connect_table WHERE login LIKE "' . $id . '"');
  6. $donnees = mysql_fetch_array($retour);
  7. if(($donnees['pass'] == $passwd) and ($passwd != "" )){
  8. $_SESSION['login'] = $id;
  9. header('Location: ok.php');
  10. }
  11. else{
  12. header('Location: ko.php');
  13. }
  14. ?>


 
et ensuite pour chaque page que je veux protéger je mets cet entête :
 

Code :
  1. <?php session_start();
  2. if($_SESSION['login'] == "" ){
  3. header('Location: ko.php');
  4. }
  5. ?>
  6. ...blabla...


 
et pour se déconnecter :
 

Code :
  1. <?php session_start();
  2. session_destroy();
  3. header('Location: connexion.php');
  4. ?>


 
soyez indulgents :d
qu'est ce qui pourrait être source d'ennuis dans ce genre de code ?
Merci :)


Message édité par Zipo le 24-09-2006 à 04:05:34
Reply

Marsh Posté le 24-09-2006 à 04:03:40   

Reply

Marsh Posté le 24-09-2006 à 09:27:29    

Ca m'interesse aussi.

Reply

Marsh Posté le 24-09-2006 à 09:31:16    

au niveau de :  
$retour = mysql_query('SELECT pass FROM connect_table WHERE login LIKE "' . $id . '"');
on pourrait facilement faire une sql injection  
en mettant du SQL dans le champ du login on pourrait faire n'importe quoi ici.
donc un simple :  
mysql_real_escape_string($id) pourrait t'être utile

Reply

Marsh Posté le 24-09-2006 à 14:28:12    

merci c'est exactement le genre d'infos que j'attendais :jap:
 
à titre informatif, que pourrait injecter l'utilisateur dans $id qui ferait foirer ma requête ?  
parceque je comprend bien les injections lorsque l'utilisateur met un début de commentaires pour masquer une condition (WHERE) ou un AND/OR, mais là comme il y a rien derrière le LIKE je vois pas trop ... ?
 
merci en tout cas :)

Reply

Marsh Posté le 24-09-2006 à 14:30:48    

Moi ma remarque serait...  
Pourquoi mettre  

Code :
  1. <?php session_start();


sur toutes les pages? Tu mets ça sur la première page et quand tu veux détruire la session tu mets le session

Code :
  1. session_destroy


Voilà ;)

Message cité 2 fois
Message édité par limp15000 le 24-09-2006 à 14:32:09
Reply

Marsh Posté le 24-09-2006 à 14:33:52    

limp15000 a écrit :

Moi ma remarque serait...  
Pourquoi mettre  

Code :
  1. <?php session_start();


sur toutes les pages? Tu mets ça sur la première page et quand tu veux détruire la session tu mets le session

Code :
  1. session_destroy


Voilà ;)


parce qu'il faut appeler session_start sur chaque page qui utilisera la session  
 
http://fr.php.net/session_start

Reply

Marsh Posté le 24-09-2006 à 14:35:06    

limp15000 a écrit :

Moi ma remarque serait...  
Pourquoi mettre  

Code :
  1. <?php session_start();


sur toutes les pages? Tu mets ça sur la première page et quand tu veux détruire la session tu mets le session

Code :
  1. session_destroy


Voilà ;)


euh d'après ce que j'ai lu, on ne peut pas utiliser $_SESSION sur les pages qui ne commencent pas par <?php session_start(); :)
d'où l'obligation de le mettre sur toutes les pages où je me sers des variables sessions
 
Voilà, mais bon si qqn veut confirmer ça serait bien :d

Reply

Marsh Posté le 24-09-2006 à 14:35:18    

ah ben grillé :o :d

Reply

Marsh Posté le 24-09-2006 à 14:42:50    

gatsu35 a écrit :

au niveau de :  
$retour = mysql_query('SELECT pass FROM connect_table WHERE login LIKE "' . $id . '"');
on pourrait facilement faire une sql injection  
en mettant du SQL dans le champ du login on pourrait faire n'importe quoi ici.
donc un simple :  
mysql_real_escape_string($id) pourrait t'être utile


 

Zipo a écrit :

à titre informatif, que pourrait injecter l'utilisateur dans $id qui ferait foirer ma requête ?  
parceque je comprend bien les injections lorsque l'utilisateur met un début de commentaires pour masquer une condition (WHERE) ou un AND/OR, mais là comme il y a rien derrière le LIKE je vois pas trop ... ?


ah si je pense avoir compris : si l'utilisateur finit correctement la requête et en écrit une autre juste derrière ?  
par exemple pour $id :

Code :
  1. toto"; SELECT * from connect_table;


j'ai bon ?

Reply

Marsh Posté le 24-09-2006 à 14:46:29    

par contre a la place de like tu mets =  
si t as -exemple bidon- toto et toti comme users ca risque de planter

Reply

Marsh Posté le 24-09-2006 à 14:46:29   

Reply

Marsh Posté le 24-09-2006 à 14:49:27    

J'ai rien dit... Vais me recoucher... :P

Reply

Marsh Posté le 24-09-2006 à 14:55:19    

mIRROR a écrit :

par contre a la place de like tu mets =  
si t as -exemple bidon- toto et toti comme users ca risque de planter


ah oui exellent merci :jap:

Reply

Marsh Posté le 24-09-2006 à 14:55:45    

limp15000 a écrit :

J'ai rien dit... Vais me recoucher... :P


dur dur de s'y mettre un dimanche hein :d

Reply

Marsh Posté le 24-09-2006 à 15:29:11    

Si tu est parano:
http://fr2.php.net/crypt
explique comment éviter que les mots de passe soient volés en cas de hack.

Reply

Marsh Posté le 24-09-2006 à 15:47:23    

Y parait que Joomla securise au niveau militaire ?

Reply

Marsh Posté le 24-09-2006 à 15:54:55    

supermofo a écrit :

Y parait que Joomla securise au niveau militaire ?


tu arrêtes de saouler ton monde avec Joomla ?

Reply

Marsh Posté le 25-09-2006 à 09:48:28    

supermofo a écrit :

Y parait que Joomla securise au niveau militaire ?


 
Y paraît que:
1- "sécurisé au niveau militaire" c'est risible
2- on s'en branle d'un n-ième CMS parmi d'autres qui est juste un fork de Mambo avec une forte dose d'évangélisme [:mlc]


---------------
Loose Change Lies | Bars | Last.fm
Reply

Marsh Posté le 25-09-2006 à 09:56:03    

de même tu peux mettre un session_regenerate_id(); lors du log, afin de changer le N° de ta session et donc d'éviter une partie d'un vol de session.

Reply

Marsh Posté le 25-09-2006 à 20:51:30    

Ouais ...
 
session_regenerate_id : ne detruit pas la session precedente.
 
Au final ton système de session devient une passoire  :pfff:

Message cité 1 fois
Message édité par supermofo le 25-09-2006 à 20:51:55
Reply

Marsh Posté le 25-09-2006 à 22:54:47    

supermofo a écrit :

Ouais ...
 
session_regenerate_id : ne detruit pas la session precedente.
 
Au final ton système de session devient une passoire  :pfff:


 
Suffit de brancher le cerveau et de lire 2 secondes les commentaires dans la doc php.
Ceci dit mea culpa, je pensais que le comportement en php 4 était de détruire quand même la session.


---------------
Loose Change Lies | Bars | Last.fm
Reply

Marsh Posté le 28-09-2006 à 13:48:19    

la fonction md5($password) pourra t'être utile pour le cryptage de ton password


Message édité par Badze le 28-09-2006 à 13:48:28
Reply

Marsh Posté le 28-09-2006 à 14:24:13    

oui merci :)
 
Dailleurs ça m'amène à vous poser une question : que penser des sites qui nous retournent notre mot de passe par mail lorsque l'on clique sur le traditionnel "J'ai oublié mon mot de passe" ?
 
Certains d'entre eux nous renvoient un nouveau mot de passe puisque le notre n'est pas stocké par défaut dans leur bdd, ils ne conservent que la version hashée :) mais d'autres nous renvoie notre mot de passe en clair... ce qui signifie qu'ils stockent notre pass non hashé dans la bdd ? :/

Reply

Marsh Posté le 28-09-2006 à 14:34:18    

Zipo a écrit :

oui merci :)
 
Dailleurs ça m'amène à vous poser une question : que penser des sites qui nous retournent notre mot de passe par mail lorsque l'on clique sur le traditionnel "J'ai oublié mon mot de passe" ?
 
Certains d'entre eux nous renvoient un nouveau mot de passe puisque le notre n'est pas stocké par défaut dans leur bdd, ils ne conservent que la version hashée :) mais d'autres nous renvoie notre mot de passe en clair... ce qui signifie qu'ils stockent notre pass non hashé dans la bdd ? :/


 
Soit il est stocké non hashé dans la bdd, soit il est stocké crypté dans la bdd et décrypté uniquement quand tu le demandes. En même temps, si la base est compromise, c'est pas d'avoir hashé le password en md5 qui va apporter une quelconque protection. Ca rend la récupération du password non triviale, mais c'est pas bien compliqué quand même.


---------------
Loose Change Lies | Bars | Last.fm
Reply

Marsh Posté le 28-09-2006 à 14:35:49    

Zipo a écrit :

oui merci :)
 
Dailleurs ça m'amène à vous poser une question : que penser des sites qui nous retournent notre mot de passe par mail lorsque l'on clique sur le traditionnel "J'ai oublié mon mot de passe" ?
 
Certains d'entre eux nous renvoient un nouveau mot de passe puisque le notre n'est pas stocké par défaut dans leur bdd, ils ne conservent que la version hashée :) mais d'autres nous renvoie notre mot de passe en clair... ce qui signifie qu'ils stockent notre pass non hashé dans la bdd ? :/


 
Ils peuvent le stocker crypté.
Ca permet de s'assurer que si seulement la base de données est compromise,  les mots de passe ne seront pas menacés.
Par contre si le site complet est hacké...
 
PS : pour la sécurisation des scripts et des sessions, sans redonner toutes les techniques (il y a plein de tutoriaux sur le sujet un peu partout), il y a toujours la solution de stocker l'adresse IP dans la session et de la comparer à l'adresse du client à chaque nouvel appel de script. Ca peut déjà éviter pas mal de problèmes...


---------------
http://weezo.net
Reply

Marsh Posté le 28-09-2006 à 14:49:25    

Weezo > Et ca permet aussi d'empécher l'accés aux zones protégés à ceux qui voient leurs Ip changer n'importe quand (AOL bonjour)

Reply

Marsh Posté le 28-09-2006 à 14:49:53    

weezo a écrit :

PS : pour la sécurisation des scripts et des sessions, sans redonner toutes les techniques (il y a plein de tutoriaux sur le sujet un peu partout), il y a toujours la solution de stocker l'adresse IP dans la session et de la comparer à l'adresse du client à chaque nouvel appel de script. Ca peut déjà éviter pas mal de problèmes...


 
Déjà proposé sur un autre topic, mais quelqu'un a fait remarquer à juste titre que les usagers d'AOL en feront les frais (puisque leur connexion peut passer par divers proxies qui changent en continu).


---------------
Loose Change Lies | Bars | Last.fm
Reply

Marsh Posté le 28-09-2006 à 14:58:38    

KrisCool a écrit :

Soit il est stocké non hashé dans la bdd, soit il est stocké crypté dans la bdd et décrypté uniquement quand tu le demandes. En même temps, si la base est compromise, c'est pas d'avoir hashé le password en md5 qui va apporter une quelconque protection. Ca rend la récupération du password non triviale, mais c'est pas bien compliqué quand même.


Les stocker en clair c'est de l'hérésie :o
 
Si la base est compromise, tu feras pas grand chose d'un hash ;) A moins d'avoir vraiment beaucoup à gagner et d'avoir aussi le script, beaucoup de temps à perdre sans garantie et surtout une puissance de calcul suffisante :)

Reply

Marsh Posté le 28-09-2006 à 15:01:09    

Zipo a écrit :

oui merci :)
 
Dailleurs ça m'amène à vous poser une question : que penser des sites qui nous retournent notre mot de passe par mail lorsque l'on clique sur le traditionnel "J'ai oublié mon mot de passe" ?
 
Certains d'entre eux nous renvoient un nouveau mot de passe puisque le notre n'est pas stocké par défaut dans leur bdd, ils ne conservent que la version hashée :) mais d'autres nous renvoie notre mot de passe en clair... ce qui signifie qu'ils stockent notre pass non hashé dans la bdd ? :/


Spa bien ça, ne serait - ce que par principe, même si t'as accès aux données sans le dit mdp, je veux pas connaitre le mdp de qui que ce soit :)

Reply

Marsh Posté le 28-09-2006 à 15:07:55    

leflos5 a écrit :

Les stocker en clair c'est de l'hérésie :o
 
Si la base est compromise, tu feras pas grand chose d'un hash ;) A moins d'avoir vraiment beaucoup à gagner et d'avoir aussi le script, beaucoup de temps à perdre sans garantie et surtout une puissance de calcul suffisante :)


 
Pas faire grand chose d'un hash ? Si la fonction de hachage a été appliquée bêtement comme c'est le cas dans la grosse majorité des cas, un procédé comme les rainbow tables permet de trouver un mot de passe sans avoir besoin d'une puissance de calcul énorme, et ce dans des temps raisonnables.
 
Donc oui c'est parfaitement exploitable un hash. Après on peut effectivement éviter ce genre de problèmes. En mettant du "sel" (cf article wikipedia) par exemple ou en utilisant autre chose qu'une fonction de hachage (cryptage).
Faut pas croire que ça n'arrive que dans des films. Sur le site web de ma guilde de MMO, une appli php non sécurisée (associée à une mauvaise configuration du cookie du forum) a permis à un mec de voler le cookie de forum de l'admin contenant le hash md5 du password, puis il a retrouvé le pass par une attaque à la rainbow table, et il a foutu le bordel tant qu'il a pu.
 
Donc la sécurité apportée par un hachage de password dans la BDD, c'est tout relatif.
Edit: après, pour simplement le masquer aux yeux de personnes de confiance, dont l'admin de la BDD, oui.

Message cité 1 fois
Message édité par KrisCool le 28-09-2006 à 15:08:41

---------------
Loose Change Lies | Bars | Last.fm
Reply

Marsh Posté le 28-09-2006 à 15:17:42    

C'est pour ça que j'aurais tendance à dire... chiffrement du mot de passe par un algorithme à sens unique, et éventuellement avec un salt aléatoire en plus. la possibilité de retrouver le mot de passe original est proche de 0 même avec le mot de passe crypter et le salt. (crypt(motdepasse, '$2$0123456789012'); )

Reply

Marsh Posté le 28-09-2006 à 15:26:11    

KrisCool a écrit :

Pas faire grand chose d'un hash ? Si la fonction de hachage a été appliquée bêtement comme c'est le cas dans la grosse majorité des cas, un procédé comme les rainbow tables permet de trouver un mot de passe sans avoir besoin d'une puissance de calcul énorme, et ce dans des temps raisonnables.
 
Donc oui c'est parfaitement exploitable un hash. Après on peut effectivement éviter ce genre de problèmes. En mettant du "sel" (cf article wikipedia) par exemple ou en utilisant autre chose qu'une fonction de hachage (cryptage).
Faut pas croire que ça n'arrive que dans des films. Sur le site web de ma guilde de MMO, une appli php non sécurisée (associée à une mauvaise configuration du cookie du forum) a permis à un mec de voler le cookie de forum de l'admin contenant le hash md5 du password, puis il a retrouvé le pass par une attaque à la rainbow table, et il a foutu le bordel tant qu'il a pu.
 
Donc la sécurité apportée par un hachage de password dans la BDD, c'est tout relatif.
Edit: après, pour simplement le masquer aux yeux de personnes de confiance, dont l'admin de la BDD, oui.


Je ne connaissais pas l'existence de ses rainbow tables  :ouch: MAintenant on est d'accord que de toutes manières, quand on parle de sécurité il faut pas se satisfaire du minimum :)
 
De toutes manières si le vol de session/cookie est rendu quasi impossible et le serveur/script sécurisé comme il faut, le risque de se faire voler quoi que ce soit est largement assez faible si t'as pas des dossiers secret/défense à cacher :d
 
Puis un détail con, celui qui veut facilement un mdp, il a qu'à le ramasser au moment où il est encore en clair s'il le veut vraiment :ange:  

Reply

Marsh Posté le 28-09-2006 à 16:04:31    

leflos5 a écrit :

Je ne connaissais pas l'existence de ses rainbow tables  :ouch: MAintenant on est d'accord que de toutes manières, quand on parle de sécurité il faut pas se satisfaire du minimum :)
 
De toutes manières si le vol de session/cookie est rendu quasi impossible et le serveur/script sécurisé comme il faut, le risque de se faire voler quoi que ce soit est largement assez faible si t'as pas des dossiers secret/défense à cacher :d
 
Puis un détail con, celui qui veut facilement un mdp, il a qu'à le ramasser au moment où il est encore en clair s'il le veut vraiment :ange:


 
Attention à toujours garder un certain sens de la mesure au niveau sécurité. Le cas concret auquel j'ai été confronté, c'est un mec avec un minimum de connaissances qui voulait vandaliser un site. Et il a réussi. Y'avait rien à voler, aucune info sensible, rien hein. Juste une volonté de mal faire d'un mec. Ca peut arriver à n'importe qui.
 
Après, pour que le mec réussisse à chopper le mot de passe en clair, c'est autre chose, ça requiert d'autres moyens que d'utiliser une faille existante pour se procurer un cookie.


---------------
Loose Change Lies | Bars | Last.fm
Reply

Marsh Posté le 28-09-2006 à 18:37:13    

Sur la totalité des sites ( yahoo , google , tous les forums possibles ) le hash est stocke dans un cookie. Avoir ce hash te permet de te logguer sans connaitre le mot de passe. Quelquefois tu px meme changer le pass ou l 'email ou arrivera le mot de passe.
 
J en ai fais pleurer plus d'un avec des cookies forgés. La seule difficulté dans l'attaque étant de trouver ou placer son XSS .
 
En gros tous les sites ou tu vois "mémoriser mon mot de passe" sont des cibles potentielles. De plus il n'y a aucune securisation du cookie en lui meme. En gros tu px très bien mettre en place un brute force qui fonctionnera à plein pot en passant par les cookies plutot que le formulaire ( qui lui a souvent la mauvaise tendance a etre plus securisé qu'ailleurs ).


Message édité par supermofo le 28-09-2006 à 18:42:06
Reply

Marsh Posté le 28-09-2006 à 19:03:53    

Une question sur mysql_real_escape_string :
 
Faut t-il mettre pour, par exemple la variable $utilisateur :
 
- Ca : $utilisateur = mysql_real_escape_string($utilisateur);
- Ou bien : mysql_real_escape_string($utilisateur);


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
Reply

Marsh Posté le 28-09-2006 à 19:05:04    

supermofo a écrit :

Y parait que Joomla securise au niveau militaire ?


Joomla est juste un CMS, bourré de failles qui plus est et aucun rapport avec le topic ...


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
Reply

Marsh Posté le 28-09-2006 à 20:03:38    

WiiDS a écrit :

Une question sur mysql_real_escape_string :
 
Faut t-il mettre pour, par exemple la variable $utilisateur :
 
- Ca : $utilisateur = mysql_real_escape_string($utilisateur);
- Ou bien : mysql_real_escape_string($utilisateur);


 
Lis la doc  [:pingouino]  
 
Valeurs de retour
Retourne la chaîne échappée (...)


---------------
Loose Change Lies | Bars | Last.fm
Reply

Marsh Posté le 28-09-2006 à 20:25:31    

KrisCool a écrit :

Lis la doc  [:pingouino]  
 
Valeurs de retour
Retourne la chaîne échappée (...)


 :jap: merci :hello:


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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