Pour un projet, je dois faire un site internet pour une entreprise. Le site étant fini, j’ai eut une modification de cahier des charges qui n’impose de protéger certaines pages via un login/mot de passe. Le site de développement est hébergé sur ma dedibox, et ira a terme sur un mutualisé 1&1 windows + bdd de base.
Pour bien faire j’ai utilisé une base de donnée MySQL, ça semble nettement mieux qu’un bricolage .htaccess/fichier texte. Après avoir crée un utilisateur MySQL et crée une table “utilisateurs” contenant id/login/mdp correspondant aux utilisateurs du site, j’ai passé les droits de l’utilisateur MySQL en “read only”.
L’accès aux pages protégées se fait par un lien du type “index.php?page=index_page_protegee.php” avec en entête de chaque page protégée un code php qui vérifie si la session est ok :
[code]<?php
if(empty($_SESSION[’_login’])) {
include(‘login.php’);
}
else {
include(‘page_protegee.php’);
?>[/code]
La page de login est un formulaire ou l’on rentre f_login et f_mdp, et passe les données en post a la page verif_login.php :
[code] <?php
session_start();
// Données générales sur le serveur SQL
$host=“localhost”; // Nom du serveur hôte
$username=“utilisateurMySQL”; // Nom d’utilisateur MySQL
$password=“pass”; // Mot de passe MySQL
$db_name=“xxx”; // Nom de la base de donnée MySQL
$tbl_name=“utilisateurs”; // Nom du nom de la table MySQL
// Se conneter au serveur et sélectionner la base de donnée a utiliser
mysql_connect("$host", “$username”, “$password”)or die(“cannot connect”);
mysql_select_db("$db_name")or die(“cannot select DB”);
// Prendre le nom d’utilisateur et le mot de passe rentré dans le formulaire
$f_login=$_POST[‘f_login’];
$f_mdp=$_POST[‘f_mdp’];
$mdp_md5 = md5($f_mdp);
// Protection contre magic quotes
$f_login = stripslashes($f_login);
$mdp_md5 = stripslashes($mdp_md5);
$f_login = mysql_real_escape_string($f_login);
$mdp_md5 = mysql_real_escape_string($mdp_md5);
$sql=“SELECT * FROM $tbl_name WHERE username=’$f_login’ and password=’$mdp_md5’”;
$result=mysql_query($sql);
// Compte le nombre de fois ou le couple login/mot de passe est trouvé dans la table
$count=mysql_num_rows($result);
// Bon si il apparait une seule fois, mauvais sinon
if($count==1){
// Le login/mot de passe ont été validés
$_SESSION[’_login’] = $f_login;
$_SESSION[’_pass’] = $mdp_md5;
echo ‘Connexion ok!’;
}
else {
echo “Mauvais login ou mauvais mot de passe”;
session_unset();
session_destroy();
}
?>[/code]
J’ai md5 le mot de passe, histoire de ne pas avoir un mot de passe en clair dans la bdd. C’est d’une utilité douteuse non ? Vu qu’on peut facilement retrouver le pass a partir du md5 ?
Ensuite il est-ce qu’il y a des points particuliers a vérifier pour se protéger des injections SQL ? Google ne m’a vraiment pas aidé, on tombe surtout sur des site de kikoolol sur des méthodes d’injection, plus ou moins bien fait.
Et dernier point, comment est-ce que je peux me protéger d’un wget sur “page_protegee.php” ? Un htaccess spécifiant localhost seul en lecture suffit ?
En vous remerciant d’avance,
Osh.