Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

PHP - ADMINISTRER EN LIGNE : PROTECTION DES PAGES


Information sur le tutorial

Catégorie :Tutoriaux Date de création : 26/08/2008 14:51:32 Vu : 10 768 fois

Note :
Aucune note

Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note

Description

Principe :
- Création d'un dossier (ADMIN) dans lequel on met ses pages d’administration.
- On accède alors simplement à son "espace d'administration en ligne" en tapant :
www.MONSITE.com/ADMIN
- ADMIN/index.php : identification par formulaire,
- On s'identifie par son identifiant et son mot de passe à définir,
Ici : un accès à 1 niveau (webmestre)
- Validation par Cookie OU Session au choix,
- Comparaison avec un code de validation généré aléatoirement,
- L'accès aux pages protégées est alors validé.

Tutorial

PHP - ADMINISTRER en ligne : PROTECTION des PAGES


Principe :

- Création d'un dossier (ADMIN) dans lequel on met ses pages d'administration.

- Accès à l'"espace d'administration en ligne" : www.MONSITE.com/ADMIN

- ADMIN/index.php : formulaire d'identification par identifiant et mot de passe.

Ici : un accès à 1 niveau (webmestre)

- Validation par Cookie OU Session au choix,

- Comparaison avec un code de validation généré aléatoirement,

- L'accès aux pages protégées est alors validé.


NB : par sécurité, changez le nom du dossier "ADMIN" (trop évident).


NB : le code de validation est stocké dans une variable de session.

Il est généré aléatoirement à chaque nouvelle identification.

Il n'est valide qu'une fois.



Les fichiers nécessaires (dossier ADMIN) :


_protect.php

contient vos identifiants et mots de passe

index.php :

formulaire d'identification

_protectpage.php :

protection des pages


vos pages à protéger

scripts à inclure

_deconnexion.php

déconnexion et retour à votre site



_protect.php


<?php // partie commune (cookie ou session)

session_start();

// -------------------------------------------------------------------------

$utilisateur = "IDENTIFIANT"; // Remplacer IDENTIFIANT par votre identifiant (au choix)

$mot_de_passe = "MOTDEPASSE"; // Remplacer MOTDEPASSE par votre mot de passe (au choix)

// -------------------------------------------------------------------------

// si le visiteur (administrateur ou collaborateur) a validé le formulaire

$login = '';

$pass = '';

if (!empty($_POST['login']) && !empty($_POST['pass'])) {

$login = filter_var($_POST['login'], FILTER_SANITIZE_STRING);

$pass = filter_var($_POST['pass'], FILTER_SANITIZE_STRING);

}

// -------------------------------------------------------------------------

// creation d un code de validation aleatoire

// -------------------------------------------------------------------------

$tableau = array("0","1","2","3","4","5","6","7","8","9",

"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",

"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z");

// Tirage aléatoire de 16 caracteres

$taille = 16;

$valeurs_aleatoires = array_rand($tableau, $taille);

// generation du code

$code_valide = '';

foreach($valeurs_aleatoires as $i)

{ $code_valide = $code_valide . $tableau[$i]; }

// -------------------------------------------------------------------------

// On stocke le code_valide sur le serveur dans une variable de session

$_SESSION["CODEVALIDE"] = $code_valide;

// -------------------------------------------------------------------------

?>

<?php

// (suite avec COOKIE)

// ------------------------------------------------------

// Si le login et le mot de passe sont corrects

if ($login == $utilisateur && $pass == $mot_de_passe) {

// copie du code dans un cookie "perso"

setcookie ("MONCOOKIE",$code_valide,time()+3600);

// ------------------------------------------------------

} else {

setcookie ("MONCOOKIE", "");

}

?>

<?php

// (suite avec SESSION)

// ------------------------------------------------------

// Si le login et le mot de passe sont corrects

if ($login == $utilisateur && $pass == $mot_de_passe) {

// copie du code dans une variable de session "perso"

$_SESSION["MASESSION"] = $code_valide;

// ------------------------------------------------------

} else {

$_SESSION["MASESSION"] = '';

}

?>



index.php


<?php // (debut avec COOKIE)

include("_protect.php");

// ------------------------------------------------------

// Accès autorisé si identifié

if (!empty($_SESSION['CODEVALIDE']) &&

md5($_COOKIE['MONCOOKIE']) ==

md5($_SESSION["CODEVALIDE"]))

{

// Redirection vers le menu de l "ADMIN"

header("Location: MONmenuADMIN.php");

exit;

}

// ------------------------------------------------------

// sinon affichage du formulaire d'identification

?>

<?php // (debut avec SESSION)

include("_protect.php");

// ------------------------------------------------------

// Accès autorisé si identifié

if (!empty($_SESSION['CODEVALIDE']) &&

md5($_SESSION["MASESSION"]) ==

md5($_SESSION["CODEVALIDE"]))

{

// Redirection vers le menu de l "ADMIN"

header("Location: MONmenuADMIN.php");

exit;

}

// ------------------------------------------------------

// sinon affichage du formulaire d'identification

?>

(suite commune)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">

<head>

<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />

<title>index.php</title>

</head>

<body>

<div align="center">

<form name="identification" method="post" action="index.php">

Identifiant : <input name="login" size="20" /><br />

Mot de passe : <input name="pass" type="password" size="20" /><br />

<input type="submit" value="Valider" />

</form>

</div>

</body></html>



_protectpage.php


<?php // (avec COOKIE)

session_start();

// ------------------------------------------------------

// comparaison avec le code de validation

// si non identifie

if (empty($_SESSION['CODEVALIDE'])

|| md5($_COOKIE['MONCOOKIE']) !=

md5($_SESSION['CODEVALIDE']))

{

// redirection vers le formulaire d identification

header("Location: index.php");

exit;

}

// ------------------------------------------------------

// si identifie, on continue

?>

<?php // (avec SESSION)

session_start();

// ------------------------------------------------------

// comparaison avec le code de validation

// si non identifie

if (empty($_SESSION['CODEVALIDE'])

|| md5($_SESSION['MASESSION']) !=

md5($_SESSION['CODEVALIDE']))

{

// redirection vers le formulaire d identification

header("Location: index.php");

exit;

}

// ------------------------------------------------------

// si identifie, on continue

?>



Vos pages à protéger

Ajouter en tout début de chaque page à protéger :


<?php

include("_protectpage.php") ;

// -------------------------------------------------------------------

?>



Insérer un bouton de déconnexion

on insère le formulaire suivant (bouton de déconnexion) dans les pages protégées (ou dans son "menu admin") :


<form method="POST" action="_deconnexion.php">

<input type="submit" value="deconnexion" name="deconnexion">

</form>



_deconnexion.php


<?php // (avec COOKIE)

session_start();

// ------------------------------------------------------

// on vide/detruit le cookie "perso" et la session

$_SESSION = array();

$session_name = session_name();

setCookie('monCookieNom'); // destruction du cookie

// destruction des informations du cookie en mémoire

unset($_COOKIE['monCookieNom']);

session_destroy();

// Redirection vers le site

header("Location: http://www.MONSITE.com");

exit;

// ------------------------------------------------------

?>

<?php // (avec SESSION)

session_start();

// ------------------------------------------------------

// on vide/detruit les variables de session

$_SESSION = array();

$session_name = session_name();

session_destroy();

// Redirection vers le site

header("Location: http://www.MONSITE.com");

exit;

// ------------------------------------------------------

?>


26 août 2008 14:53:43 :
mise en page du tutorial
26 août 2008 16:14:23 :
mise en page (fin ?)
06 septembre 2008 11:18:35 :
Ajout d'un code de validation généré aléatoirement. + actualisation du code
06 septembre 2008 11:29:48 :
mise en page Word2007
06 septembre 2008 11:42:25 :
-
06 septembre 2008 11:45:24 :
-
14 mars 2009 09:10:18 :
Mise a jour en fonction des commentaires.
14 mars 2009 09:17:56 :
Mise a jour en fonction des commentaires.
14 mars 2009 09:24:56 :
modification (3eme essai ...)
14 mars 2009 09:27:14 :
Malgré plusieurs tentatives, mes MODIFICATIONS DU TUTO ne sont pas prises en compte .... Allez voir sur : http://www.asp-php.net/scripts/asp-php/proteger-page.php
19 mars 2009 20:05:41 :
mise a jour
20 mars 2009 17:20:35 :
maj
signaler à un administrateur
Commentaire de coucou747 le 28/08/2008 08:14:29

   session_register("MASESSION");

ca ne s'utilise plus depuis php4.

if ($_POST['login'] == "$utilisateur" && ($_POST['pass'] == "$mot_de_passe"))

pourquoi ces guillemets autour des variables ? pourquoi ces parentheses inutiles ?

setcookie ("MONCOOKIE ", "protectOK", time() + 3600); // validité 1 heure (3600 secondes)
   // remplacer protectOK par ce que vous voulez

NON ! c'est une constante, c'est dangereux, voir suicidaire de faire ca... si tu mets ca dans une apps open source genre phpBB ou autre, c'est hyper dangereux...

signaler à un administrateur
Commentaire de malalam le 28/08/2008 19:14:13 administrateur CS

Hello,

globalement, je trouve aussi que ton tuto date de l'an pèbre (désolé, je suis provençal...).
$PHPSESSID ne s'utilise plus non plus.
Le principe est bon, la manière de l'appliquer l'est moins.
Et c'est réducteur de parler de sécurité de cette manière. Il manque beaucoup de choses, surtout sur un BO administrateur.
Mais bon...au moins, il n'y a pas de faute majeure (le vieux PHP incompatible avec beaucoup de configurations actuelles mis à part).

signaler à un administrateur
Commentaire de bdlj39 le 28/08/2008 20:37:51

salut,

apparemment tu ne fais que comparer un mot de passe en clair à sa valeur stocker, elle aussi en clair, sur une page web sur ton site, ne serait-il pas intéressant de crypter ton mot de passe avec une clé MD5 ?
ce serait un peu moins risquer !

$password_crypted = md5($password);

et comme ça tu stock dans ta page ton mot de passe sous forme crypté.

tcho

signaler à un administrateur
Commentaire de jreaux62 le 28/08/2008 21:01:12

Merci pour vos commentaires.
Je suis sûr que les lecteurs de ce tuto les liront aussi avec interêt.
J'en tiendrai compte pour enrichir ce tuto.

Il s'agit plus d'un "mode d'emploi" qu'un "prêt-à-l'emploi".

Autrement dit : à chacun de l'adapter et de l'améliorer !
(cryptage des données, ...)

A lire aussi :
"LES SESSIONS PHP, COMMENT ÇA MARCHE ?"
http://www.phpcs.com/tutoriaux/SESSIONS-PHP-COMMENT-MARCHE_600.aspx
notamment la section :
"Approche pratique : concevoir un accès restreint"

signaler à un administrateur
Commentaire de jreaux62 le 06/09/2008 11:49:13

J'ai modifié mon tuto en fonction des commentaires ci-dessus.

signaler à un administrateur
Commentaire de charlycbu le 08/09/2008 17:48:11

Ou sinon, pour contourner le fait que le mot de passe et l'identifiant soient envoyés en clair sur la toile, il est possible d'obliger l'utilisateur, sur un serveur Apache à utiliser une connexion sécurisée en mettant SSLRequireSSL dans un fichier .htaccess dans le répertoire requis, soit modifié les paramètres depuis l'interface IIS pour obliger l'utilisateur à passer par un tunnel sécurisé en https (SSL v3, ou TLS v1 ou AES 256, ou autres...)

signaler à un administrateur
Commentaire de charlycbu le 08/09/2008 17:49:06

Ou sinon, pour contourner le fait que le mot de passe et l'identifiant soient envoyés en clair, il est possible d'obliger l'utilisateur, sur un serveur Apache à utiliser une connexion sécurisée en mettant SSLRequireSSL dans un fichier .htaccess dans le repertoire requis, soit modifié les paramètres depuis l'interface IIS pour obliger l'utilisateur à passer par un tunnel sécurisé en https (SSL v3, ou TLS v1 ou AES 256, ou autres...)

signaler à un administrateur
Commentaire de longshot41 le 18/09/2008 19:32:04

[quote]Ou sinon, pour contourner le fait que le mot de passe et l'identifiant soient envoyés en clair, il est possible d'obliger l'utilisateur, sur un serveur Apache à utiliser une connexion sécurisée en mettant SSLRequireSSL dans un fichier .htaccess dans le repertoire requis, soit modifié les paramètres depuis l'interface IIS pour obliger l'utilisateur à passer par un tunnel sécurisé en https (SSL v3, ou TLS v1 ou AES 256, ou autres...)[/quote]
Développes un peu stp, merci je suis interressé.

Sinon pour le tuto, je suis du même avis que les autres. Mais que cela n' enlève en rien le mérite que tu as eu à le faire. Propre, précis.
Good LUCK

signaler à un administrateur
Commentaire de webdeb le 24/09/2008 01:31:53

Quelques remarques à mon tour.

1/ Commençons par le tout début :

if (!empty($_POST['login']) && !empty($_POST['pass'])) {
$login = $_POST['login'];
$pass = $_POST['pass'];
} else {
$login = '';
$pass = '';
}

Le code ci-dessus à deux points améliorables. Tout d'abord à quoi te sert fondamentalement la copie inutile des variables ? Je dis inutile car tu copies les variables sans en vérifier et / ou filtrer les valeurs. De plus le else ne sert strictement à rien si tu initialises bien tes variables avant. Ce qui donne en utilisant l'extension filter :

$login = '';
$pass = '';
if (!empty($_POST['login']) && !empty($_POST['pass'])) {
    $login = filter_var($_POST['login'], FILTER_SANITIZE_STRING);
    $pass = filter_var($_POST['pass'], FILTER_SANITIZE_STRING);
}

2/ Concernant le code aléatoire, il ne sert strictement à rien. Il apporte complexité d'une part et semblant de sécurité d'autre-part car il n'a rien d'un vrai jeton généré aléatoirement. Utiliser la fonction crypt() aurait été plus judicieux. De plus, la portion de code qui s'occupe de générer ton mot de passe aléatoire aurait sa place dans une fonction. Au final, tu peux malgré tout ce qui concerne le jeton y compris la variable $_SESSION['CODEVALIDE']. Une variable de session $_SESSION['isAuthenticated'] avec la valeur true ou false suffit à elle seule pour marquer l'utilisateur comme loggué ou non. Pas la peine de créer une tripotée de variables de session.

3/ Aïe aïe aïe, là c'est le drame :

<?php
// ------------------------------------------------------------------------------------------------------------------
if ($_POST['login'] == $utilisateur && $_POST['pass'] == $mot_de_passe")
{ // Accès autorisé si identifié
// Redirection vers le menu de l "espace d administration"
header("Location: http://www.MONSITE.com/ADMIN/MONmenuADMIN.php");
}
// ------------------------------------------------------------------------------------------------------------------
else
{ // sinon affichage du formulaire d'identification
?>

Depuis quand faisons-nous des redirections côté serveur lorsque le HTML a déjà été envoyé au navigateur. Les appels à header() doivent se faire exclusivement / impérativement avant tout envoi de contenu au navigateur. Header() <=> entêtes != Body <=> corps et données du document. De plus, après une redirection avec header(), on doit penser à ajouter un arrêt immédiat de l'exécution du programme PHP avec exit() ou die(). Le code précédent peut se résumer en quelques lignes à (en créant la fonction qui va bien) :

<?php

if(true === checkLoginAndPassword($login, $password)) {
    header('Location: http://www.monsite.com/admin/panel.php');
    exit;
}
?>
<html>
<head>
<title>Identification</title>
</head>
<body>
<!-- Formulaire ici -->
</body>
</html>

4/ Enlève tes horribles commentaires inutiles qui servent de décoration mais rendre moins confortables la relecture et compréhension du code. L'utilisation des symbôles de commentaires ne devrait servir uniquement qu'à marquer des commentaires utiles au programme.

5/ Concernant ta page _protect.php, elle se résume à seulement 3 / 4 lignes et pas plus :

<?php

if(!isset($_SESSION['isAuthenticated']) || ]false === $_SESSION['isAuthenticated']) {
    header('Location: http://www.monsite.com/admin/index.php');
    exit;
}
?>

6/ Au sujet de la déconnexion, il y'a une méthode plus élégante pour mettre fin à la session :

<?php

session_start();
$_SESSION = array(); // ou bien moins radical : $_SESSION['isAuthenticated'] = false;
setCookie('monCookieNom'); // destruction du cookie
unset($_COOKIE['monCookieNom']); // destructeur des informations du cookie en mémoire
session_destroy();
unset($_SESSION);
header('Location: http://www.monsite.com/admin/index.php');
exit;
?>

Ceci n'est qu'un début de piste pour t'aider à améliorer ton code. Personnellement je noterai 5/10 tout au plus ce tutoriel...

++

Hugo.

signaler à un administrateur
Commentaire de miss fafa le 05/02/2009 17:28:48

chapeau!

signaler à un administrateur
Commentaire de ikarios34 le 13/03/2009 16:48:38


-------------------------------------------------------------------------------------------


Effectivement, apparemment (selon moi bien sûr) le script de préparation de jreaux61, souffre de petites erreurs de logiques, mais, avec mon humble perception, son code <?php?>; est vraiment très bon..!

Lire, le très bon commentaire de WEBDEB, posté à 01.31.53, par ailleurs fort intéressant; clair et de plus sur chaque -_selon WEDEB_- "remarque", toujours animée avec des qualités de logique, d'évolutivité, précision et de netteté, elles sont toujours suivies d'une solution <?php?> complète, bien étudiée, me semble-t-il.

Mais les remarques de WEBDED comportent aussi certaine "failles" ... je n'aime pas ce terme,enfin bon voilà passons :-) nous ne sommes là que pour améliorer au mieux possible la théorisation d'un problème, je n'aime pas non plus ce mot là lol et l'application de celui-ci sous un thème communiquable (évolutif aussi), c.a.dire ne prenons pas trop de directions à la fois. Ce thème, si le sujet reste de cette même qualité, deviendra alors la / les jonction(s) des points pertinents de chaque publication(s) future(s) de "JREAUX61, WEBDEB et de toute(s)et tout(s)  autres programmeuse(s)eur(s). Ce pense que le résultat pourra être magnifique!!!!

Pour l'instant le sujet,(je suis nouveau et c'est mon premier post) m'intéresse pleinement puisque c'est un de mes domaines.

bien à vous, amusez vous, moi je m'amuse comme un 'tit fou (!) avec ces "bestioles" là (on s'entend...hein...je parle des "machines" à la 2001 d'Odyssée de l'Espace :-)...rires.

philippe, ceux qui apprécient ce que je note, ;-)


------------------------------------------------------------------------------------------

signaler à un administrateur
Commentaire de griffondorr le 19/03/2009 18:07:05

moi j'aime bien cette source, mais elle a l'air bien compliquer a appliquer lol

signaler à un administrateur
Commentaire de griffondorr le 20/03/2009 00:07:27

tutorial complet mais un peu compliquer pour moi ;)

signaler à un administrateur
Commentaire de Erand le 17/04/2009 14:46:44

Certes, ce tuto a des lacunes, mais, aussi du potentiel et je t'encourage a l'améliorer. Cet un bel effort.

signaler à un administrateur
Commentaire de lebogoss28104 le 29/04/2009 16:10:32

Je n'arrive pas à l'integrer à mon site ! =(
Pourais tu donnais quelques explications ?
Merci d'avance ! ;-)

signaler à un administrateur
Commentaire de csphpchtml le 11/06/2009 17:48:25

Cool ta source mais si on un site pas en ligne sa fonctionne comme ame ??? r^pons stp

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,094 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.