Leçons de niveau 2

Mot de passe/Sécurité et mots de passe

Une page de Wikiversité.
Sauter à la navigation Sauter à la recherche
Début de la boite de navigation du chapitre
Sécurité et mots de passe
Icône de la faculté
Chapitre no 2
Leçon : Mot de passe
Chap. préc. :Les règles d'or
fin de la boite de navigation du chapitre
Icon falscher Titel.svg
En raison de limitations techniques, la typographie souhaitable du titre, « Mot de passe : Sécurité et mots de passe
Mot de passe/Sécurité et mots de passe
 », n'a pu être restituée correctement ci-dessus.

Introduction[modifier | modifier le wikicode]

La quasi totalité des sites utilisent des connexions par mot de passe, afin d'accéder à des espaces privés, par exemple. Avec les développements du web, de nouveaux criminels ont fait leur apparition. Un de leur passe-temps est d'usurper l'identité d'une personne, souvent prise au hasard, et ainsi de laisser libre cours à leur imagination et à leurs « talents ». Pour cela, ils vont utiliser des failles.

En tant que webmaster, vous vous devez d'assurer la sécurité de vos inscrits. Cela n’est pas très compliqué, et peut éviter bon nombre de problèmes. Il est préférable d’avoir quelques notions de programmation, mais tout sera fait pour vous simplifier la tâche.

Pour tous les exemples qui suivent, les technologies utilisées seront PHP/MySQL mais le principe s'applique à tout autre langage Web.

L'attaque "Man in the middle"[modifier | modifier le wikicode]

Cette attaque consiste à se placer entre un site web et l'utilisateur. Le pirate peut alors récupérer toutes les informations échangées entre ceux-ci, à l'aide d'un logiciel. Autrement dit, celui qui réussit une tel attaque peut alors récupérer les informations nécessaires pour se connecter au site avec le compte de l'utilisateur.

La protection la plus efficace est le chiffrement ou le hachage des données. Il existe de nombreuses fonctions pour réaliser ceci, tel que MD5, ou SHA. Prenons le code suivant, avec pour pseudo Test, et pour mot de passe "ok719!a+" :

$pseudo=$_POST['pseudo'];
$password=$_POST['passe'];

On aura donc une requête comme ceci :

SELECT * FROM utilisateurs WHERE pseudo='Test' AND passe='ok719!a+'

Le mot de passe transite donc en clair, quelle aubaine pour l'attaquant ! Le but est donc de rendre cette instruction illisible. On va alors créer une empreinte du mot de passe, grâce à MD5 et SHA. MD5 n'étant plus considéré comme sûr, il est à utiliser uniquement en complément de SHA, qui lui, est à privilégier.

$pseudo=$_POST['pseudo'];
$password=sha1($_POST['passe']);


Nous aurons alors la requête suivante :

SELECT * FROM utilisateurs WHERE pseudo="test" AND passe="f22bc54f2cf3f89bf3793e25845e092695059a68"


Si vous avez choisi un mot de passe suffisamment long, l'attaquant mettra alors beaucoup de temps, au minimum, à trouver votre mot de passe, ou une collision de celui-ci.

Maintenant imaginons que la personne n'aie pas suivi les conseils de la leçon précédente, et que son mot de passe soit "démocratie". L'attaque dictionnaire étant la plus rapide, même avec un long mot de passe, il ne tiendra que quelques minutes.

Pour protéger les éventuels mots de passe de ce genre, il y a une technique : l’utilisation de préfixes/suffixes dans les mots de passe. Le code :

$pseudo=$_POST['pseudo'];
$password=sha1($_POST['passe'].'préfffix007!');


Voila comment cacher le mot de passe de vos utilisateurs au reste du monde. Cela implique aussi de stocker les mots de passe hachés dans vos bases de données, rendant alors impossible la restitution de ceux-ci en cas de perte. Mais la sécurité n'a pas de prix, et ce n’est pas un véritable problème car les solutions sont nombreuses.

L'injection SQL[modifier | modifier le wikicode]

Cette technique consiste à modifier une requête envoyée à la base de donnée pour arriver à ses fins. Cela peut aller de l'usurpation d'identité à la destruction du contenu de la base de donnée. Cette faille est présente dès lors que les données entrées dans le formulaire sont utilisées en l'état.

Prenons l'exemple suivant, avec toujours la même valeur en pseudo et en mot de passe "ébé*1<43":

$pseudo=$_POST['pseudo'];
$password=$_POST['passe'];

La requête sera donc :

SELECT * FROM utilisateur WHERE pseudo="Test" AND passe="ébé*1<43"


Si le pseudo et le mot de passe sont envoyés dans la requête sans aucun traitement avec, par exemple, ce code :

$sql="SELECT * FROM utilisateurs WHERE pseudo='".$pseudo."' AND passe='".$password."'";


Il suffit alors d'envoyer comme mot de passe "' OR 1=1" pour que la requête ressemble à :

SELECT * FROM utilisateurs WHERE pseudo='Test' AND passe='' OR 1=1'


1=1 étant toujours vrai, l'utilisateur "Test" est donc maintenant connecté sans avoir eu besoin de son mot de passe. Heureusement on peut éviter cela, grâce à la fonction mysql_real_escape_string(). Cette fonction échappe tous les caractères potentiellement dangereux avec un antislash ("\").

$pseudo=mysql_real_escape_string($_POST['pseudo']);
$password=mysql_real_escape_string($_POST['passe']);


Vous êtes à présent protégé des injections SQL, la requête ressemblant alors à ceci :

SELECT * FROM utilisateurs WHERE pseudo='Test' AND passe='\' OR 1=1'

Conclusion[modifier | modifier le wikicode]

Pour une sécurité "maximale", utilisez un script semblable à celui-ci :

$pseudo = mysql_real_escape_string($_POST['pseudo']);
$password = mysql_real_escape_string(sha1('préfixe'.md5($_POST['password']).'suffixe'));


Modifier le préfixe et le suffixe ne devrait pas poser trop de problèmes. Ce n'est absolument pas difficile à mettre en place et peut éviter bien des mésaventures.

Enfin, rappelez-vous de la règle d'or : Ne faites jamais confiance aux données extérieures à votre script.

Voir aussi[modifier | modifier le wikicode]

Liens externes[modifier | modifier le wikicode]