Authentification HTTP au moyen d'une base de données
Hors ligneBoss183 Le 26/02/2008 à 16:10 Profil de Boss183 Configuration de Boss183

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
Hors ligneAnthony Le 26/02/2008 à 17:10 Profil de Anthony Configuration de Anthony

Admin
Salut

Est-ce que tes mots de passe sont bien encodés avec la fonction PASSWORD() de MySQL ? car si tes mots de passe sont encodés avec autre chose (genre md5() ou pire pas encodés du tout donc visibles en clair) ça ne fonctionnera pas ;)

Sinon pour savoir si PHP est en module apache ou en CGI, appelle la fonction phpinfo() dans une page

Sinon attention car ton script contient une belle faille de sécurité :)

Voilà ton script corrigé :


<?php
// Interroger la base de données

  $result mysql_query ('SELECT prenom FROM utilisateurs
         WHERE nom_utilisateurs="'
.mysql_real_escape_string($_SERVER['PHP_AUTH_USER']).'"
         AND mot_de_passe=PASSWORD("'
.mysql_real_escape_string($_SERVER['PHP_AUTH_PW']).'")') OR die('erreur');

  if(mysql_num_rows($result) === 0)
  {
        header('WWW-Authenticate: Basic realm="homelive"');
        header('HTTP/1.0 401 Unauthorized'); //Coup d'arrêt
        exit;
  }

  //ici le code protégé
?>
--

Hors ligneBoss183 Le 27/02/2008 à 14:27 Profil de Boss183 Configuration de Boss183

merci beaucoup anthony et qu'est-ce qu'il faut changer si mes mot de passe sont encodé en MD5 ?
Hors ligneAnthony Le 27/02/2008 à 22:43 Profil de Anthony Configuration de Anthony

Admin
à la place de PASSWORD tu mets MD5
--

Hors ligneBoss183 Le 03/03/2008 à 09:56 Profil de Boss183 Configuration de Boss183

En fait j'ai fait avec le mot de passe encodé avec la fonction PASSWORD de phpMyAdmin mais lorsque je lance mon fichier PHP voila l'erreur qu'il me met

Notice: Undefined index: PHP_AUTH_USER in c:\projet_homelive\anthony.php on line 15

Notice: Undefined index: PHP_AUTH_PW in c:\projet_homelive\anthony.php on line 16

Warning: Cannot modify header information - headers already sent by (output started at c:\projet_homelive\anthony.php:15) in c:\projet_homelive\anthony.php on line 20

Warning: Cannot modify header information - headers already sent by (output started at c:\projet_homelive\anthony.php:15) in c:\projet_homelive\anthony.php on line 21


<?php

//paramètres de connexion
require('C:\Projet_homelive\parametres\mysql_params.php');
//fonctions de connexion au serveur mysql
require('C:\Projet_homelive\utils\mysql_connexion.php');

     //connexion Ã  la base de données
     //paramètres : serveur, utilisateur, mot de passe, base de données
     $link DBconnect($serveur,$user,$mdp,$bdd);
     
// Interroger la base de données

  $result mysql_query ('SELECT idADMIN FROM admin
         WHERE idADMIN="'
.mysql_real_escape_string($_SERVER['PHP_AUTH_USER']).'"
         AND mdp=PASSWORD("'
.mysql_real_escape_string($_SERVER['PHP_AUTH_PW']).'")') OR die('erreur');

  if(mysql_num_rows($result) === 0)
  {
        header('WWW-Authenticate: Basic realm="homelive"');
        header('HTTP/1.0 401 Unauthorized'); //Coup d'arrêt
        exit;
  }

  //ici le code protégé
echo "<H1>trop bien</H1>"
?>


(spécial dédicasse pour le nom du fichier anthony ^^) et ouai donc je sais pas trop quoi faire voilà mon script entier

Hors ligneAnthony Le 03/03/2008 à 12:42 Profil de Anthony Configuration de Anthony

Admin
require('C:\Projet_homelive\parametres\mysql_params.php');

==> ça c'est très mauvais, il faut mettre un chemin relatif et pas absolu, c'est à dire que tu mets require 'prarametres\mysql_params.php'; et non le chemin entier.

Ensuite si la variable n'existe pas il faut exécuter PHP en module apache et non CGI. Cependant tu peux essayer de faire ça :


<?php
if(!isset($_SERVER['PHP_AUTH_USER']))
{
     header('WWW-Authenticate: Basic realm="My Realm"');
     header('HTTP/1.0 401 Unauthorized');
}
else
{
     //ton code de traitement
}
?>


essaie ça
--

Hors ligneBoss183 Le 03/03/2008 à 13:45 Profil de Boss183 Configuration de Boss183

merci Anthony mais je n'ai pas très bien compris ce que je mettais dans else
Hors ligneAnthony Le 03/03/2008 à 14:35 Profil de Anthony Configuration de Anthony

Admin
Bah dans le else ça veut dire que le mec a renseigné un auth_user, en toute rigueur faudrait faire ça :

if(!isset($_SERVER['PHP_AUTH_USER']) OR !isset($_SERVER['PHP_AUTH_PASSWORD']))

et dans le else faut mettre la connexion à mysql qui vérifie si l'auth_user ou l'auth_password sont les bons.
--

Vous avez résolu votre problème avec VIC ? Faites-le savoir sur les réseaux sociaux !
Vulgarisation-informatique.com
Cours en informatique & tutoriels