Mot de passe/Protéger les connexions
Une page de Wikiversité.
Mot de passe/Protéger les connexions est une ébauche concernant l'informatique. Vous pouvez aider le projet Wikiversité en l'améliorant.
| Chapitre 2 | |||
| Leçon : Mot de passe | |||
|---|---|---|---|
| Chap. préc. : | Introduction aux mots de passe | ||
En raison de limitations techniques, la typographie souhaitable du titre, « Mot de passe : Protéger les connexions
Mot de passe/Protéger les connexions », n'a pu être restituée correctement ci-dessus.
Sommaire |
[modifier] Introduction
La quasi totalité des sites utilisent des connexions par mot de passe afin de protéger les informations des leurs membres. 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 webmasters, vous vous devez d'assurer la sécurité des informations des 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 tout les exemples qui suivent, les technologies utilisées seront PHP/MySQL, n'ayant pas suffisamment de connaissances dans les autres langages web (asp, jsp).
[modifier] L'attaque "Man in the middle"
En très bref, cela consiste pour le cracker à se placer entre le serveur et le client, et de récupérer toutes les informations s'y échangeant, à l'aide d'un logiciel. Cette technique, particulièrement vicieuse, permet au cracker de voir toutes les informations qui transitent entre le client et le serveur, et notamment le nom d'utilisateur et le mot de passe en clair !
La manière la plus simple de protéger ces informations est le cryptage des informations envoyées lors de la connexion. Prenons la portion de code suivante, avec pour pseudo test, et en 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+"
On peut difficilement faire plus explicite, mais heureusement, on peut toujours faire mieux. Il suffit de crypter le mot de passe : pour cela nous disposons de deux (il y en a d'autres, mais ces deux la suffisent) algorithmes de cryptage en php : md5() et sha1(). il est indispensable d'utiliser les deux fonctions car le md5 n'est plus considéré comme sûr, étant de plus en plus simple à forcer. D'où l'utilisation du sha1, en complément.
$pseudo=$_POST['pseudo']; $password=sha1(md5($_POST['passe']));
Et la requête sera
SELECT * FROM utilisateurs WHERE pseudo="test" AND passe="af8b1580d04b738c5a1820ccd3e4efff82222c22"
Même s'il arrive à forcer le sha1 (une bonne partie de plaisir, le md5 mesurant 32 caractères) il lui restera le md5.
Pour cette deuxième partie, imaginons que la personne n'a pas suivie 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 passes de ce genre, il y a une technique : l'utilisation de préfixes/suffixes dans les mots de passes. Le code :
$pseudo=$_POST['pseudo']; $password=sha1(md5($_POST['passe'].'préfffix007!'));
Vous voila donc avec des connexions par mot de passe quasiment indécryptable, pour votre sécurité et celle de vos inscrits.
Remarque : Cette technique de cryptage, simple à mettre en œuvre, n'est pourtant pas idéale. En effet, pour se connecter au compte d'un utilisateur quelconque, le hackeur n'a pas besoin du mot de passe de l'utilisateur, le mot de passe crypté suffit. Dans ce cas, le pirate n'a qu'à faire la requête SQL « à la main » et pourra ainsi se connecter à votre base de données et utiliser le compte. En revanche, cette technique a le grand avantage de ne pas fournir le mot de passe au pirate. Les internautes utilisant souvent le même mot de passe pour plusieurs sites, la découverte de leur mot de passe autoriserait le pirate à se connecter à tous les sites. Heureusement, le mot de passe est quasiment introuvable avec cette technique et l'attaque sera alors limité à votre site et le pirate ne pourra usurper l'identité de la victime sur l'ensemble des sites auquels elle est inscrite. Vos membres vous en seront infiniment reconnaissants !!!
[modifier] L'injection SQL
Sans doute la technique la plus simple à mettre en place : à partir d'un formulaire de connexion non sécurisé, on peut injecter du code php comme bon nous semble, sans aucune limite, ce qui peux avoir des effets dévastateurs sur votre base de donnée, entre autres. 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'];
Avec donc la requête suivante :
SELECT * FROM utilisateur WHERE pseudo="test" AND passe="ébé*1<43"
La valeur envoyée par le formulaire est traitée telle qu'elle est envoyée, c'est de là que vient la faille : si le script qui envoie la requête est :
$sql=sprintf("SELECT * FROM utilisateurs WHERE pseudo=%s and password=%s",$pseudo,$password);
Si l'on entre comme mot de passe '1" OR 1=1;drop table utilisateurs', la requête sql ressemblera à :
SELECT * FROM utilisateurs WHERE pseudo="test" AND passe="1" OR 1=1;drop TABLE utilisateurs"
Vous voilà débarrassé de la table utilisateurs de votre base de donnée, c'est vos inscrits qui vont être heureux. Heureusement vous pouvez éviter cela, grâce à la fonction htmlentities():
$pseudo=htmlentities($_POST['pseudo']); $password=htmlentities($_POST['passe']);
Vous êtes à présent protégé des injection sql et la requête du pirate ressemblera à :
SELECT * FROM utilisateur WHERE pseudo="test" AND passe="1\" OR 1=1;drop table utilisateurs"
[modifier] Conclusion
Pour une sécurité maximale, voila le code que vous devez utiliser.
$pseudo=htmlentities($_POST['pseudo']); $password=htmlentities(sha1(md5(préfixe.$_POST['password'.suffixe])));
Ce n'est absolument pas difficile à mettre en place et peut éviter bien des mésaventures.

