Authentification HTTP au moyen d'une base de données

Authentification HTTP au moyen d'une base de données - PHP - Programmation

Marsh Posté le 26-02-2008 à 16:10:34    

Bonjour à tous,
je souhaiterais protéger une page HTML grâce à l'authentification HTTP et en utilisant des noms d'utilisateurs et mot de passe déjà contenu dans ma base de données, j'ai trouvé un script pour ce que je souhaite faire, au début je me connecte à ma BDD (jusque là pas de problème) mais par la suite le script donne ça :
 
 
// Interroger la base de données
  $rq = "SELECT prenom FROM utilisateurs
         WHERE nom_utilisateurs='{$_SERVER['PHP_AUTH_USER']}'
         AND mot_de_passe=PASSWORD('{$_SERVER['PHP_AUTH_PW']}'}";
  $result = mysql_query ($rq);
  $ligne = @mysql_fetch_array ($result);
  if ($ligne)
  { // Si un enregistrement a été renvoyé
    $auth = TRUE;
    }
    }
//Si on trouve rien:
if (!$auth)
{ header('WWW-Authenticate: Basic realm="homelive"');
   header('HTTP/1.0 401 Unauthorized'); //Coup d'arrêt
   }
?>
 
j'ai remplacé nom_utilisateur pas idUSER
et               mot_de_passe par mdp
 
pour que ça corresponde à ma table (je ne sais si j'ai bien fait ça correctement)
 
lorsque je lance ma page HTML on me demande bien de m'authentifier mais l'authentification ne marche pas alors que je tape un idUSER et un mdp existant ds ma BDD.
 
De plus, j'ai entendu dire que l'on pouvait utiliser cette fonction que si PHP fonctionnait en module apache mais comment savoir si PHP est exécuté en qualité de module d'Apache et non en CGI.
 
Merci d'avance
 

Reply

Marsh Posté le 26-02-2008 à 16:10:34   

Reply

Marsh Posté le 26-02-2008 à 16:38:48    

pas super propre le code que tu as trouvé...
 
sinon avec ton code les mots de passe doivent être crypté (avec la fonction mysql PASSWORD), et j'imagine que dans ta table utilisateurs ils ne le sont pas ?
 

Reply

Marsh Posté le 26-02-2008 à 16:45:31    

tu veux dire dans la table utilisateurs de ma BDD ?

Reply

Marsh Posté le 26-02-2008 à 16:46:37    

en gros t'as une page d'accueil avec un login pass dans un form avec le nom de ta page où te loguer genre  

Code :
  1. <form method="post" action="page_verif.php">
  2. <input type="text" name="login" value="" />
  3. <input type="password" name="pass" value="" />
  4. <input type="submit" value="Valider" />
  5. </form>


bon tout ça, ça te donne la page de login, maintenant la page d'action serveur

Code :
  1. <?php
  2. if($_POST['login'] && $_POST['pass']){//Ici on a bien un login et pass
  3.   $login=$_POST['login'];
  4.   $pass=$_POST['pass'];
  5.   $rq="SELECT prenom";
  6.     $rq.=" FROM utilisateurs";
  7.     $rq.=" WHERE nom_utilisateurs='".$login."'";
  8.     $rq.=" AND mot_de_passe='".$pass."'";
  9.   $result = mysql_query ($rq);
  10.   if(!mysql_fetch_row($result)){//Ici on trouve aucun résultat
  11.     echo "pas bon login pass";
  12.   }else{//Ici l'authetification est OK
  13.     echo "authetification ok";
  14.   }//Fin de condition d'authentification
  15. }else{//Ici toutes les données n'ont pas été envoyées
  16.   echo 'pas de login ou pass';
  17. }//Fin de condition de présence des données
  18. ?>


En gros tu récupères une variable login et une variable pass tu les fais match via mysql si tu trouves un résultat c'est bon, sinon ça passe pas (normalement si ta BDD est bien faite, tu en trouves un et un seul).
 
Il est à noter que là c'est la base de chez la base, après il y a tout plein de procédures de sécurité, type md5, et anti injection sql etc etc à mettre en place...plus de la session etc etc....

Message cité 1 fois
Message édité par lordashram le 26-02-2008 à 16:50:33
Reply

Marsh Posté le 26-02-2008 à 16:59:39    

merci beaucoup lordashram mais moi ma table où sont contenu les login et les mots de passe qui vont pouvoir s'authentifier s'appellent user, dans ma table, l'identifiant s'appelle idUSER et le mot de passe est mdp, peux-tu me dire je remplace quoi par quoi dans le script stp

Reply

Marsh Posté le 26-02-2008 à 17:01:14    

lordashram a écrit :

Code :
  1. <?php
  2. if($_POST['login'] && $_POST['pass']){//Ici on a bien un login et pass
  3.   $login=$_POST['login'];
  4.   $pass=$_POST['pass'];
  5.   $rq="SELECT prenom";
  6.     $rq.=" FROM utilisateurs";
  7.     $rq.=" WHERE nom_utilisateurs='".$login."'";
  8.     $rq.=" AND mot_de_passe='".$pass."'";
  9.   $result = mysql_query ($rq);
  10.   if(!mysql_fetch_row($result)){//Ici on trouve aucun résultat
  11.     echo "pas bon login pass";
  12.   }else{//Ici l'authetification est OK
  13.     echo "authetification ok";
  14.   }//Fin de condition d'authentification
  15. }else{//Ici toutes les données n'ont pas été envoyées
  16.   echo 'pas de login ou pass';
  17. }//Fin de condition de présence des données
  18. ?>



' OR 1=1 --
:o


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 26-02-2008 à 17:18:12    

j'ai fait ce fichier page_verif.php, je me connecte à ma BDD, j'ai remplacé nom_utilisateurs par idUSER et mot_de_passe par mdp pour que ça corresponde à ma table mais lorsque je tape mon login et mon mdp ça me met  pas bon login pass alors que j'ai tapé les bons

Reply

Marsh Posté le 26-02-2008 à 17:24:14    

bon en fait c'est bon j'arrive à avoir authentification OK c'est parce que dans ma BDD le mdp était codé en MD5, comment faire pour que le formulaire de connexion reconnaisse le MD5 ?

Reply

Marsh Posté le 26-02-2008 à 17:30:41    

En remplaçant PASSWORD par MD5 peut être?


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 26-02-2008 à 17:54:33    

Ah oui tiens c'est vrai je pense jamais aux requêtes imbriquées!
D'ailleurs elles marchent depuis peu sous MySQL, non?


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 26-02-2008 à 17:54:33   

Reply

Marsh Posté le 26-02-2008 à 18:18:13    

Ah mince, voilà qui m'enlève quelques espoirs  [:vibidoo]


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 26-02-2008 à 20:21:23    


 
nop bien avant MySQL5. La version 5 est assez récent. C'est depuis MySQL4.XX, je crois depuis 4.3

Reply

Marsh Posté le 26-02-2008 à 20:40:29    

weed a écrit :

 

[b]nop bien avant MySQL5[b]. La version 5 est assez récent. C'est depuis MySQL4.XX, je crois depuis 4.3

 

4.1, sortie en avril 2003.

 

Et la v5 n'est pas si récente que ça, la version 5.0 est sortie en décembre 2003 :D Donc il n'y a que 8 mois entre les 2 ^^

Message cité 1 fois
Message édité par Dj YeLL le 26-02-2008 à 20:41:16

---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 26-02-2008 à 21:22:17    

Dj YeLL a écrit :


 
4.1, sortie en avril 2003.
 
Et la v5 n'est pas si récente que ça, la version 5.0 est sortie en décembre 2003 :D Donc il n'y a que 8 mois entre les 2 ^^


 
 
Et bahh,  [:banditsuzukixp] je pensais pas que MySQL5 était si vieux que ca. Les entreprises sont tellement à la ramasse sur leur serveur ou sur 1 herbergeur PRO que j'ai l'impression que c'est tout recent la V5. Jusqu'a l'an dernier, je n'ai pas pu coder sur une V5 (maintenant, je suis sur Oracle). Elles sont moins hésitante de passer d'une 4.0 à une 4.1 alors que pour passer à une 5,les entreprises font la patte lourde ce qui amplifie l'impression que la V5 est tout nouveau par rapport à la 4.1
 
 
[HS]Pas mal du tout DjYeLL, le site de ta copine/femme. Ca interessera sûrement ma grand mère mais quand elle se décidera se mettre à l'info.  
Merci pour le lien. Je bookmark pour plus tard.
[/HS]

Reply

Marsh Posté le 27-02-2008 à 14:24:21    

dwogsi a écrit :

En remplaçant PASSWORD par MD5 peut être?


 
c dans mon formulaire ? je dois mettre <input type="MD5" name="pass" value="" /> non ?
 

Reply

Marsh Posté le 27-02-2008 à 14:30:14    

boss183 a écrit :

 

c dans mon formulaire ? je dois mettre <input type="MD5" name="pass" value="" /> non ?

 



NON
Plutôt :

Code :
  1. $rq="SELECT prenom FROM utilisateurs
  2.  WHERE nom_utilisateurs='".$login."
  3.  AND mot_de_passe='".md5($pass)."'";


Message édité par babasss le 27-02-2008 à 14:31:50

---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
Reply

Marsh Posté le 27-02-2008 à 14:41:05    

J'AI DIS EN REMPLAÇANT  PASSWORD PAR MD5, RIEN D'AUTRE!!!!
Au moins comme ça ce sera peut être plus claire. Utilisez les fonctions du SGBD!


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 27-02-2008 à 14:50:55    

mais où dont que tu vois écrit PASSWORD ds mon fichier php j'ai pass à la rigueur ?!?!

Reply

Marsh Posté le 27-02-2008 à 14:51:18    

dwogsi a écrit :

J'AI DIS EN REMPLAÇANT  PASSWORD PAR MD5, RIEN D'AUTRE!!!!
Au moins comme ça ce sera peut être plus claire. Utilisez les fonctions du SGBD!


 
Je vois franchement pas de quoi tu parles ...


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 27-02-2008 à 14:54:11    

dwogsi a écrit :

J'AI DIS EN REMPLAÇANT  PASSWORD PAR MD5, RIEN D'AUTRE!!!!
Au moins comme ça ce sera peut être plus claire. Utilisez les fonctions du SGBD!


Eh oh, sur un autre ton, on n'est pas au marché au poisson.... C'est facile pour toi du haut de ta connaissance de balancer des phrases comme ca "En remplaçant PASSWORD par MD5 peut être?"
Mais si la personne ne comprend pas, peut-être peux-tu l'aider un peu plus en le mettant sur la voie...

 

@boss183 : Ce que dit dwogsi (à raison d'ailleurs, même si la manière n'est pas là) c'est d'utiliser le SQL plutôt que le php pour faire le md5, donc cela donnerait :

Code :
  1. $rq="SELECT prenom FROM utilisateurs
  2.  WHERE nom_utilisateurs='".$login."'
  3.  AND mot_de_passe=MD5('".$pass."')";


NB : Par contre, il y a peut etre un pb de quote dans le SQL


Message édité par babasss le 27-02-2008 à 14:54:23

---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
Reply

Marsh Posté le 27-02-2008 à 14:57:08    

Non mais je jouait la carte de la simplicité là...
En me basant sur le première version donnée de son code, à savoir celle contenant PASSWORD() dans la requête. Suffit tout simplement de remplacer PASSWORD par MD5 et c'est réglé.

 

Et donc si tu as repris le code qui t'as été donné (qui ne manque pas de trous de sécurité soit dit en passant) tu peux aussi écrire :
$rq.=" AND mot_de_passe=MD5('".$pass."')";

 

PS : C'est pas parce qu'on écrit une ligne en majuscules et qu'on colle quelques ! qu'on est forcément en train de "gueuler" hein :o je vous rappel que je post quand même pour aider...


Message édité par dwogsi le 27-02-2008 à 14:59:44

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 27-02-2008 à 15:00:09    


Heureusement que j'avais noté ça à la fin de mon post :
 
 

Citation :

Il est à noter que là c'est la base de chez la base, après il y atoutplein de procédures de sécurité, type md5, et anti injection sqletcetc à mettre en place...plus de la session etc etc....
 


J'avais donné juste la base et en gros la structure des tests après faut savoir d'adapter, on va pas lui tenir la #@%$ pour pisser non plus... mais bon il apprendra au fur et a mesure les règles de sécurité et d'éthique (le fameux md5 et l'anti injection sql).
 
Dj YeLL +1 [/b]pour l'utilisation des fonctions du SGBD (enfin bon mysql n'en est pas trop un, pas d'intégrité ref donc c'est moyen...enfin passons...).

Message cité 1 fois
Message édité par lordashram le 27-02-2008 à 15:04:02
Reply

Marsh Posté le 27-02-2008 à 15:03:35    

Ba ça fait jamais de mal de rappeler qu'il faut sécuriser ce code.
Pour beaucoup, si ça marche c'est que tout va bien!


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 27-02-2008 à 15:07:12    

En même temps j'ai cité les éléments qu'il fallait voir et dans la zone PHP il y a une topic spécial sur ça juste en dessous de celui où on est (pour le moment) donc s'il cherche un peu, il trouvera de quoi on parle. Faut s'y intéresser un minimum pour progresser.
Cela dit, il est vrai que c'est une faille très commune sur les sites de noobs et d'ailleur des sites pro aussi, je dénoncerais pas certains grands sites de moteurs de recherches spécialisés qui ne font pas de filtres à l'injection SQL ou certains sites d'asso dont le log souffre des problèmes précités et donc où se loguer en admin est un jeu d'enfant.
Mais s'il sait à peine faire un formulaire de log, je pense que le mieux est qu'il apprenne déjà le début de la comm client/serv sur ce qu'il est en train de faire, et ensuite il va fignoler la sécu...

Reply

Marsh Posté le 27-02-2008 à 15:18:04    

merci à tous mais euh j'ai fait fait ce que vous avez dit :
   $rq="SELECT idUSER FROM user";
   $rq.=" WHERE idUSER='".$login."'";
   $rq.=" AND mdp=MD5('".$pass."')";
 
et l'authentification ne marche pas pourtant mon mot de passe est bien codé en md5 aussi dans ma base

Reply

Marsh Posté le 27-02-2008 à 15:22:25    

Et d'une : entoure de code de balise de code (par ex: [code = php] [/ code] (en enlevant tous les espaces)
et de deux je t'avais signalé un possible pb de quote dans la fonction MD5
=> essaye d'enlever les ' entre ".$pass." pour obtenir MD5(".$pass." )


---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
Reply

Marsh Posté le 27-02-2008 à 15:53:31    

lorsque j'en lève les quotes ça me met une erreur 2 lignes plus loin et je n'ai pas compris ce que tu veux dire par [code = php] ?!?!
 
je laisse mon code qi quelqu'un sait d'ou viens l'erreur :

Code :
  1. <?php
  2. //paramètres de connexion
  3. require('C:\Projet_homelive\parametres\mysql_params.php');
  4. //fonctions de connexion au serveur mysql
  5. require('C:\Projet_homelive\utils\mysql_connexion.php');
  6. //connexion à la base de données
  7. //paramètres : serveur, utilisateur, mot de passe, base de données
  8. $link = DBconnect($serveur,$user,$mdp,$bdd);
  9. if($_POST['login'] && $_POST['pass']){//Ici on a bien un login et pass
  10.    $login=$_POST['login'];
  11.    $pass=$_POST['pass'];
  12.    $rq="SELECT idUSER FROM user";
  13.    $rq.=" WHERE idUSER='".$login."'";
  14.    $rq.=" AND mdp=MD5('".$pass."')";
  15.    $result = mysql_query ($rq);
  16.  
  17.    if(!mysql_fetch_row($result)){//Ici on trouve aucun résultat
  18.     echo "pas bon login pass";
  19.   }else{//Ici l'authetification est OK
  20.       echo "authentification ok";
  21.    }//Fin de condition d'authentification
  22.     }else{//Ici toutes les données n'ont pas été envoyées
  23.    echo 'pas de login ou pass';
  24.   }//Fin de condition de présence des données
  25.   ?>


Message édité par boss183 le 27-02-2008 à 15:54:22
Reply

Marsh Posté le 27-02-2008 à 16:05:33    

Il veut dire :
[code = php]
// Ton code Php
echo 'Ton code Php';
function tonCodePhp($ton = 'code')
{
    echo 'php';
}
[ /code]
 
=
 

Code :
  1. // Ton code Php
  2. echo 'Ton code Php';
  3. function tonCodePhp($ton = 'code')
  4. {
  5.    echo 'php';
  6. }


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 27-02-2008 à 16:08:26    

Quel est l'intérêt de faire ça ?
 
et puis je suis désolé mais je ne comprend pas bien comment mettre mon code là ?!?!

Reply

Marsh Posté le 27-02-2008 à 16:08:52    

Laisse tomber


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 27-02-2008 à 16:14:35    

bah je veux bien mais n'empêche ça marche toujours pas vous croyez que ça peut marcher si j'utilise sha1 et puis quelles sont les différences avec md5 ?

Reply

Marsh Posté le 27-02-2008 à 16:15:36    

Tu connais Google ?


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 27-02-2008 à 16:26:03    

Code :
  1. <?php
  2. //paramètres de connexion
  3. require('C:\Projet_homelive\parametres\mysql_params.php');
  4. //fonctions de connexion au serveur mysql
  5. require('C:\Projet_homelive\utils\mysql_connexion.php');
  6. //connexion à la base de données
  7. //paramètres : serveur, utilisateur, mot de passe, base de données
  8. $link = DBconnect($serveur,$user,$mdp,$bdd);
  9. if($_POST['login'] && $_POST['pass']){//Ici on a bien un login et pass
  10.   $login=$_POST['login'];
  11.   $pass=$_POST['pass'];
  12.   $rq="SELECT idUSER FROM user";
  13.   $rq.=" WHERE idUSER='".$login."'";
  14.   $rq.=" AND mdp=MD5(".$pass." )";
  15.   $result = mysql_query ($rq);
  16.  
  17.   if(!mysql_fetch_row($result)){//Ici on trouve aucun résultat
  18.    echo "pas bon login pass";
  19.  }else{//Ici l'authetification est OK
  20.      echo "authentification ok";
  21.   }//Fin de condition d'authentification
  22.    }else{//Ici toutes les données n'ont pas été envoyées
  23.   echo 'pas de login ou pass';
  24.  }//Fin de condition de présence des données
  25.  ?>


Et là ca marche ?

Message cité 1 fois
Message édité par babasss le 27-02-2008 à 16:26:33

---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
Reply

Marsh Posté le 27-02-2008 à 16:38:54    

babasss a écrit :

Code :
  1. <?php
  2. //paramètres de connexion
  3. require('C:\Projet_homelive\parametres\mysql_params.php');
  4. //fonctions de connexion au serveur mysql
  5. require('C:\Projet_homelive\utils\mysql_connexion.php');
  6. //connexion à la base de données
  7. //paramètres : serveur, utilisateur, mot de passe, base de données
  8. $link = DBconnect($serveur,$user,$mdp,$bdd);
  9. if($_POST['login'] && $_POST['pass']){//Ici on a bien un login et pass
  10.   $login=$_POST['login'];
  11.   $pass=$_POST['pass'];
  12.   $rq="SELECT idUSER FROM user";
  13.   $rq.=" WHERE idUSER='".$login."'";
  14.   $rq.=" AND mdp=MD5(".$pass." )";
  15.   $result = mysql_query ($rq);
  16.  
  17.   if(!mysql_fetch_row($result)){//Ici on trouve aucun résultat
  18.    echo "pas bon login pass";
  19.  }else{//Ici l'authetification est OK
  20.      echo "authentification ok";
  21.   }//Fin de condition d'authentification
  22.    }else{//Ici toutes les données n'ont pas été envoyées
  23.   echo 'pas de login ou pass';
  24.  }//Fin de condition de présence des données
  25.  ?>


Et là ca marche ?


Le problème vient peut-être du nom du champ idUSER ne correspond pas au champ qui contient le login ?

Reply

Marsh Posté le 27-02-2008 à 16:39:46    

merci babass mais quand j'ai remplacé par ton code voila ce qu'il me met :
 
Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in c:\projet_homelive\page_verif.php on line 21
pas bon login pass

Reply

Marsh Posté le 27-02-2008 à 16:41:39    

Un peu de lecture :
http://fr.php.net/mysql_error

 


+1 :o


Message édité par dwogsi le 27-02-2008 à 16:44:43

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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