IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo
Sommaire > Sécurité / Administration
        Connaître l'ip réelle du visiteur
        Utiliser l'authentification HTTP
        Authentification LDAP avec Open LDAP
        Gérer des taches Cron
        Classe qui 'limite' les possibilités de vol de session
        Protéger un espace d'administration



Auteur : jolatouf
Version : 16/01/2006
Connaître l'ip réelle du visiteur
function realip() {
   //recupere l adresse ip de l ordi de l utilisateur
   if (isSet($_SERVER)) {
    if (isSet($_SERVER["HTTP_X_FORWARDED_FOR"])) {
     $realip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    } elseif (isSet($_SERVER["HTTP_CLIENT_IP"])) {
     $realip = $_SERVER["HTTP_CLIENT_IP"];
    } else {
     $realip = $_SERVER["REMOTE_ADDR"];
    }

   } else {
    if ( getenv( 'HTTP_X_FORWARDED_FOR' ) ) {
     $realip = getenv( 'HTTP_X_FORWARDED_FOR' );
    } elseif ( getenv( 'HTTP_CLIENT_IP' ) ) {
     $realip = getenv( 'HTTP_CLIENT_IP' );
    } else {
     $realip = getenv( 'REMOTE_ADDR' );
    }
   }
   return $realip;
}

Auteur : Sub0
Version : 16/01/2006
Utiliser l'authentification HTTP
Le login est définit dans le script. Le fichier .htaccess permet d'utiliser la variable $_SERVER['REMOTE_USER'] pour mémoriser la saisie durant toute la session.
En effet, lorsque PHP est éxécuté en mode CGI, les variables 'PHP_AUTH_USER' et 'PHP_AUTH_PW' seront toujours vides.
Voici donc la solution :
<?php
//============================================================
//  PARAMETRES DE CONFIGURATION
//============================================================
$cfg['adm_login']  = 'admin';  // Le login d'administrateur
$cfg['adm_pass']   = 'pass';   // Le mot de passe d'administrateur


//============================================================
//  FORMULAIRE ET TEST D'AUTHENTIFICATION
//============================================================
if((!isset($_SERVER['PHP_AUTH_USER']) ||
    !isset($_SERVER['PHP_AUTH_PW'])) &&
    preg_match('/Basic\s+(.*)$/i',$_SERVER['REMOTE_USER'],$matches)){
  list($name,$pass)=explode(':',base64_decode($matches[1]));
  $_SERVER['PHP_AUTH_USER']=strip_tags($name);
  $_SERVER['PHP_AUTH_PW']=strip_tags($pass);
}
if($_SERVER['PHP_AUTH_USER']!=$cfg['adm_login'] ||
   $_SERVER['PHP_AUTH_PW']!=$cfg['adm_pass']){
  header('WWW-Authenticate: Basic realm="Connexion..."');
  header('HTTP/1.0 401 Unauthorized');
  die('Erreur : Identification incorrecte !');
}


//============================================================
//  AUTHENTIFICATION ACCEPTEE
//============================================================
echo 'Authentification acceptée.';


//============================================================
?>
Le .htaccess
<IfModule mod_rewrite.c>
   RewriteEngine on
   RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization},L]
</IfModule>

Auteur : saint-pere
Version : 16/01/2006
Authentification LDAP avec Open LDAP
Avant tout, il faut vérifier que le fichier php.ini contienne bien :
extension=ldap.so
<?php   

// si un login + mot de passe a été saisi.
if($saisieEffectuer) { 
$ds=ldap_connect("W.X.Y.Z");  // Adresse du serveur LDAP
       
if ($ds) {   
 
    // identification 
    if (ldap_bind($ds)) {  // Connexion anonyme
 
        // preparation des données 
        // l'objet user n'est pas forcement appelé uid donc  à verifier
        $dn = "uid=$login , dc=MaSociete, dc=fr";  // la syntaxe doit être exacte
        // Lors d'un  encodage MD5 sur OpenLDAP une réencryptage est fait par défaut
        // Le mode de cryptage est conservé et concaténé dans votre mot de passe
        $value = "{MD5}".base64_encode( pack( 'H*' , md5($pass) ) );
        // userpassword est le nom du champs utilisé pour conserver votre mot de passe sur OpenLDAP
        // Celui ci est différent en fonction de l'annuaire (norme X500 utilisée)
        $attr = "userpassword"; 
 
        // comparaison des valeurs
        // l'affichage de userpassword est impossible car protégé dans slapd.conf
        // on est donc obligé de faire une comparaison directement dans le code pour que cela fonctionne
        $r=ldap_compare($ds, $dn, $attr, $value);
 
        if ($r === -1) {
            echo "Erreur : ".ldap_error($ds);
        } elseif ($r === TRUE) {
            echo "Mot de passe correct.";
        } elseif ($r === FALSE) {
            echo "Mot de passe incorrect : ".$value;
        }
 
    } else {
        echo "Impossible de se connecter au serveur LDAP.";
    }           
 
    ldap_close($ds);

} else {
    echo "Impossible de se connecter au serveur LDAP.";
}
 
}

?>


<html>
<head>
<title>Authentification</title>
</head>
<body>
<br>
<script language="Javascript">
function verifierSaisie() {
if(document.authentification.login.value=="") {
alert("Login non saisi.");
}
else {
if(document.authentification.pass.value=="") {
alert("Pass non saisi");
}
else {
document.authentification.cours.value="en cours...";
document.authentification.submit();
}
}
}
</script>
<div align="center">
<form name="authentification" action="<?php  $PHP_SELF ?>" method="post">
<table width="90%" border="0" cellspacing="0" >
<tr>
<td colspan="2" align="center"><b><font size="+1">Authentification</font></b></td>
</tr>
<tr>
<td>Login :</td>
<td><input style="border-style:solid" type="text" name="login" size="16" maxlength="30"></td>
</tr>
<tr>
<td>Pass :</td>
<td><input style="border-style:solid" type="password" name="pass" size="16" maxlength="30"></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="hidden" value="true" name="saisieEffectuer">
<input type="button" value="Annuler" onclick="window.close()">&nbsp;
<input type="button" OnClick="verifierSaisie()" value="Ok"></td>
</tr>
</table>
<input type='text' style='border:none; ' name='cours' value='' size=11 >
</form>
</div>
</body>
</html>

Auteur : Galak`
Version : 17/01/2006
Gérer des taches Cron
Ce script permet de faire l'interface entre toutes vos taches cron php et toutes les facons possibles de les exécuter.
Chacune de vos taches sera placée dans un fichier php qui sera inclu par le script ci-dessous
(vous pouvez donc placer les includes et connexion à la base dans ce fichier pour ne pas avoir à les mettre dans
vos scripts de taches cron), toutes vos taches (donc tous vos scripts) devant se retrouver dans un même dossier.

Vous pourrez exécuter vos taches, par l'intermédiaire de ce script, aussi bien en ligne de commande (PHP CGI ou CLI)
que par un simple appel dans votre navigateur (pour débug, paliatif en cas d'indisponibilité de cron ou pour webcron.org).

Lors de l'appel par le navigateur, vous pouvez passer en paramêtre
  • Une fréquence de rafraichissement pour exécuter la tache toutes les X secondes, ainsi qu'un nombre de rafraichissement
    optionnel dans le cas ou elle ne doit pas s'exécuter indéfiniment
  • Un temps d'attente avant de lancer la tache pour pouvoir par exemple exécuter 2 fois la même tache à la même heure en décalant
    la 2e pour qu'elle laisse le temps à la première de finir (utile pour webcron.org qui ne permet d'exécuter les taches que toutes les heures)
  • Un paramêtre pour exécuter la tache en arrière plan. Dans ce cas le navigateur n'attend pas que la tache se termine
    (le mail envoyé permettant de savoir comment s'est déroulée la tache).
    • ne pas planter la tache si on ferme le navigateur
    • ne pas laisser le navigateur mouliner pour rien
    • avoir une fréquence d'exécution plus précise (le navigateur rafraichissant la page au bout de X seconde APRES le chargement
      de la page, donc apres l'exécution de la tache quand elle n'est pas exécutée en arrière plan, ce qui décale le rafraichissement)
    • ne pas interrompre les rafraichissements quand la tache ne se termine pas (timeout par exemple)
/**************************************************************************************************
* Fichier exécutant les taches cron
* Il est recommandé de placer ce fichier dans un dossier protégé par .htaccess/.htpasswd
*
* Paramêtres :
* refresh (http uniquement) : fréquence d'exécution de la tache cron en secondes (rechargement de la page)
* nbrefresh (http uniquement) : nombre d'exécution de la tache cron, illimité si non précisé et si refresh est défini
* bg (http uniquement) : exécution de la tache en arrière plan (le navigateur n'attend pas qu'elle soit terminée)
* sleep (http uniquement) : temps d'attente, en secondes, avant d'exécuter la tache, utile pour exécuter plusieurs taches
* à la même heure sans les chevaucher dans le cas ou on n'est pas libre de configurer précisément l'heure (webcron.org)
* p1 : premier paramètre de la tache cron à exécuter
* p2 : deuxième paramètre de la tache cron à exécuter
*
* Appel :
* HTTP : http://www.domain.tld/crons/crons.php?file=tache&refresh=3600&p1=arg1&p2=arg2&bg=1 
* (tache exécutée toutes les heures en arrière plan)
* CGI : php-cgi -q /home/www/crons/cron.php tache arg1 arg2
* CLI : php /home/www/crons/cron.php tache arg1 arg2
*
* Il est recommandé d'exécuter en arrière plan une tache appelée en HTTP avec le paramêtre refresh.
* Cela permet de ne pas interrompre la tache si on ferme le navigateur, ou le processus de rafraichissement 
* si une des taches ne se termine pas (par exemple trop longue).
*
* Variables à utiliser dans les scripts appelés par ce fichier :
* $cr : retour chariot
*       -> '\n' lors de l'appel en ligne de commande pour avoir un retour chariot dans les mails texte résultant de la tache
*       -> '<br />' lors de l'appel par HTTP pour avoir un retour à la ligne à l'écran
**************************************************************************************************/

// Dossier ou se trouvent les scripts des taches cron
define('CRONS_PATH','crons/modules/');

// On se place à la racine pour que toutes les fonctions s'exécutent de la même facon que lorsqu'elles sont appelées depuis l'index.php
chdir('/home/www');

// Appel HTTP
if ($_GET['file'])
{
   $cmode='http';
   $cr="<br />";
   $file=$_GET['file'];
   $refresh=$_GET['refresh'];
   $nbrefresh=$_GET['nbrefresh'];
   $background=$_GET['bg'];
   $param1=$_GET['p1'];
   $param2=$_GET['p2'];
   $sleep=$_GET['sleep'];
   if ($sleep > 60) $sleep=60;

   if ($sleep) sleep($sleep);

   $head='<html><head>';
   if ($refresh and $nbrefresh != 1)
   {
      $nbrefresh--; // On décrémente le nombre de rafraichissement à chaque chargement
      $head.='<meta http-equiv="refresh" content="'.$refresh.';URL='.preg_replace('/nbrefresh=([0-9]+)/ie',
  "'nbrefresh=$nbrefresh'",$_SERVER['REQUEST_URI']).'">';
   }
   $head.='</head><body>';
   $foot='</body></html>';
}
// Appel en ligne de commandes
else
{
   $cmode='cgi';
   $cr="\n";
   $file=$argv[1];
   $param1=$argv[2];
   $param2=$argv[3];
   $background=$refresh=$nbrefresh=$sleep=''; // Ces 4 paramêtres ne sont pas utilisés en ligne de commande
   $foot='';
}

if (!$file) echo 'Vous devez préciser le fichier à exécuter.';
elseif (!is_file(CRONS_PATH.$file.'.php')) echo 'Le fichier "'.$file.'.php" demandé n\'existe pas.';
else
{
   if ($cmode == 'http')
   {
      // Si la tache est appelée en http et qu'il est demandé à ce qu'elle soit exécutée en arriere plan...
      if ($background)
      {
         header("HTTP/1.1 200 OK"); // On envoi l'header OK
         header("Content-Length: 256"); // On envoi la taille des données (256 octets)
         // On affiche un message, qu'on complète à 256 octets (necessaire pour que ca fonctionne sous IE)
         echo str_pad($head.date("d/m à H:i:s").' - La tache va s\'exécuter en arrière plan. Vous recevrez un mail 
 lorsqu\'elle sera terminée.</body></html>', 256);
         flush(); // On vide le buffer de sortie
      }
      else echo $head;
      ob_start(); // On démarre la bufferisation pour pouvoir récupérer le contenu de la page et l'envoyer par mail
   }

   // Includes
   Vos include ici

   // Connexion à la base
   Connexion à mysql et sélection de la base si vos crons les utilisent

   echo 'Tache exécutée le '.date("d/m à H:i:s").'.'.$cr.$cr;

   $timestart=getmicrotime();
   $nbquery=0; // Dans mon cas chaque mysql_query() incrémente $nbquery, à adapter selon vos besoins
   $txt1=$txt2=''; // Variables pouvant être définies dans les scripts inclus, pour personnaliser la fin de l'affichage (cf plus bas)

   include CRONS_PATH.$file.'.php';

   $time=round(getmicrotime() - $timestart,2);

   echo $cr.'Tache exécutée en '.$time.' secs'.$txt1.' avec '.$nbquery.' requêtes'.$txt2.'.';
   
   // Déconnexion de la base
   @mysql_close($dblink);

   // Si le script est appelé en http, on envoi le contenu de la page générée par mail
   if ($cmode == 'http')
   {
      // Envoi du mail en remplacant les '<br />' par des '\n'
      mail('example@example.com', 'Cron : '.$_SERVER['REQUEST_URI'],str_replace('<br />',
  "\n",ob_get_contents()),"From: cron@domain.tld\nReply-To: cron@domain.tld");
      ob_end_flush();
   }
}

echo $foot;
?> 
La fonction getmicrotime utilisée ci-dessus (issue de la doc PHP de la fonction microtime()) :
function getmicrotime()
{
   list($usec,$sec)=explode(' ',microtime());
   return ((float)$usec + (float)$sec);
}

Auteur : Kioob
Version : 27/07/2006
Classe qui "limite" les possibilités de vol de session
Donc, voici une petite classe qui "limite" les possibilités de vol de session. J'utilise cette classe au sein d'un framework, et ait donc été obligé d'enlever pas mal de trucs afin de la rendre portable, j'espère que je n'en ai pas trop enlevé. Deux mécanismes sont utilisés :

  1. Vérification de la durée de la session.
  2. Controle d'un ID transmis en même temps que l'ID de session, mais qui change à chaque hit. Pour les accès concurrents, un timeout de 10 secondes est utilisé.
Dans cette version l'ID est changé au moment du "session_close()". Et il faut qu'il soit appelé avant que du contenu soit envoyé. Cela ne devrait pas poser de problème sur un site "bien construit". La classe est à utilisée comme singleton (pas de double instanciation). Je ne vais pas trop détailler le code, qui n'est d'ailleurs que très peu commenté...Aucun support ne sera assuré.
Mode d'emploi :
Ouverture de la session
$session = new k_session();
$session->enabled();
puis
Fermeture de la session
$session->close();
<?php
class k_session
{
    var $is_new = true;
    var $enabled = false;

    var $concurrency_timeout = 10 ;
    var $history_trigger_nb = 5 ;
    var $history_expire = 60 ;

    function k_session()
    {
        if( !empty( $_COOKIE[ session_name() ] ) )
        {
            $this->start();
        }
    }

    function start()
    {
        if( $this->enabled === true ) return;
        $this->enabled = true;

        $random_id = @ $_COOKIE[ 'K_SID' ];
        $start_time = time();

        session_start();

        $valid = true;

        // Expiration checking
        if( $valid and isset( $_SESSION['_k_time'] ) )
        {
            if( $_SESSION['_k_time'] + ini_get( 'session.gc_maxlifetime' ) < time() )
            {
                $valid = false;
            }
        }

        // Random ID checking
        if( $valid and isset( $_SESSION[ '_k_random_id' ] ) )
        {
            if( $random_id === $_SESSION[ '_k_random_id' ][ 'current' ] )
            {
                // Ok.

            }
            elseif( $time = @ $_SESSION[ '_k_random_id' ][ 'old' ][ $random_id ] )
            {
                if( $time < $start_time )
                {
                    $valid = false;
                }
            }
            else
            {
                $valid = false;
            }

            // Clean up the history
            if( count( $_SESSION[ '_k_random_id' ][ 'old' ] ) >= $this->history_trigger_nb )
            {
                foreach( $_SESSION[ '_k_random_id' ][ 'old' ] as $idx => $time )
                {
                    if( $time + $this->history_expire < $start_time )
                    {
                        unset( $_SESSION[ '_k_random_id' ][ 'old' ][ $idx ] );
                    }
                }
            }
        }

        // Is not valid ?
        if( ! $valid )
        {
            $_COOKIE[ 'K_SID' ] = NULL;
            $_SESSION = array();
            session_destroy();
            session_id( md5( uniqid( mt_rand(), true ) ) );
            session_start();
        }

        // Set some vars
        $this->is_new = ( count( $_SESSION ) > 0 );
        $_SESSION['_k_time'] = time();
    }

    function destroy()
    {
        if( $this->enabled !== true ) return;
        $this->enabled = false;
        session_destroy();

        setcookie( 'K_SID', NULL, NULL, '/', ini_get( 'session.cookie_domain' ) );
        setcookie( session_name(), '', NULL, '/', ini_get( 'session.cookie_domain' ) );
    }

    function change_id()
    {
        if( $this->enabled !== true ) return;

        static $already_done = false;
        if( $already_done !== false ) return;
        $already_done = true;

        if( ! isset( $_SESSION[ '_k_random_id' ] ) )
            $_SESSION[ '_k_random_id' ] = array( 'current' => NULL, 'old' => array() );
        
        // Change the ID

        // Set to keep the current ID for some seconds
        $old_id = $_SESSION[ '_k_random_id' ][ 'current' ];
        if( $old_id !== NULL )
        {
            $_SESSION[ '_k_random_id' ][ 'old' ][ $old_id ] = time() + $this->concurrency_timeout ;
        }

        // Set the new ID
        $new_id = md5( uniqid( mt_rand(), true ) );
        $_SESSION[ '_k_random_id' ][ 'current' ] = $new_id;

        setcookie( 'K_SID', $new_id, NULL, '/', ini_get( 'session.cookie_domain' ) );
    }

    function close()
    {
        if( $this->enabled !== true ) return;
        $this->enabled = false;

        $this->change_id();
        session_write_close();
    }
}
?>

Auteur : Ludovic Giambiasi
Version : 22/08/2006
Téléchargez le zip
Protéger un espace d'administration
Ce code permet de protéger l'accès à une page.

Pour l'essayer :
  • Lancer la page sur le serveur
  • Saisissez les informations telles que le login et le mot de passe
  • Cliquer sur OK
Pour changer le login et le mot de passe, regarder dans le code, tout y est expliqué.



Consultez les autres pages sources


Valid XHTML 1.0 TransitionalValid CSS!

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2006 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.