:-y

Joyeux anniversaire

mercredi 18 avril 2012 - 19:00

Cela fait 2 ans jour pour jour, 2 ans déjà que Tontof existe. Aujourd'hui était donc le jour idéal pour se lancer.

Depuis quelques temps l'idée me trottait dans la tête. Et puis, j'ai hésité à me lancer dans l'auto-hébergement, et j'ai finalement choisi l'option de facilité en prenant un hébergeur... ce n'est que partie remise.

Qu'est-ce que vous trouverez sur tontof.net ? Un peu de tout mais surtout des choses qui concernent le libre, linux, l'informatique et bien sûr d'autres activités diverses et variées que je vous laisserai découvrir. Je cherche à m'émanciper et à quitter les services privés qui je sais ne font pas bon usage de toutes nos informations. Et puis j'en ai marre de devoir accepter qu'une application ait besoin d'accéder à la liste de mes contacts pour une boussole. Alors je partagerai avec vous les codes que je développe pour répondre à des besoins précis sans avoir à baisser son...

Bref, vous avez compris.

Alors pour commencer, il a fallu que je me trouve un joli moteur pour faire mon blog. J'ai pensé à blogotext de Timo que je suis régulièrement, mais cela me semblait un peu trop compliqué et je cherchais un outil encore plus minimaliste. Dans sa liste de moteurs de blog, je me suis très vite orienté vers picoblog . J'ai regardé le code, il m'a bien plu et j'ai commencé à ajouter les choses qui me manquaient :
- une installation automatique
- une gestion de session sécurisée
- des commentaires

Il me reste encore beaucoup d'autres choses à faire, mais je ne voulais pas attendre pour vous rejoindre. Je partagerai évidemment avec vous ce code, mais pour vous faire patienter, je vous livre la gestion de la session que j'ai réalisée grâce au code de Sebsauvage.
Comme je ne voulais pas plusieurs fichiers et que je voulais ajouter d'autres possibilités, j'ai fait un mixte avec shaarli pour créer une classe Session qui permet de gérer facilement les sessions.

J'espère que cela vous plaira. N'hésitez pas à faire des critiques dans les commentaires et à m'ajouter dans vos amis facebook, google+ et twitter. Ah ben non je suis bête j'ai pas de compte. Mais vous pouvez maintenant me suivre grâce à mon flux RSS :-)

Au fait, j'allais oublier. Très bon anniversaire Noé !

Edit : 2013-08-31 : voir http://tontof.net/kriss/php5/session pour une version à jour

<?php 
/**
 * Session management class
 * http://www.developpez.net/forums/d51943/php/langage/sessions/
 * http://sebsauvage.net/wiki/doku.php?id=php:session
 * http://sebsauvage.net/wiki/doku.php?id=php:shaarli
 *
 * Features:
 * - Everything is stored on server-side (we do not trust client-side data,
 *   such as cookie expiration)
 * - IP addresses + user agent are checked on each access to prevent session
 *   cookie hijacking (such as Firesheep)
 * - Session expires on user inactivity (Session expiration date is
 *   automatically updated everytime the user accesses a page.)
 * - A unique secret key is generated on server-side for this session
 *   (and never sent over the wire) which can be used
 *   to sign forms (HMAC) (See $_SESSION['uid'] )
 * - Token management to prevent XSRF attacks.
 * 
 * TODO:
 * - log login fail
 * - prevent brute force (ban IP)
 *
 * HOWTOUSE:
 * - Just call Session::init(); to initialize session and
 *   check if connected with Session::isLogged()
 */

class Session
{  
    
// If the user does not access any page within this time,
    // his/her session is considered expired (in seconds).
    
public static $inactivity_timeout 3600;
    private static 
$_instance;
 
    
// constructor
    
private function __construct()
    {
        
// Use cookies to store session.
        
ini_set('session.use_cookies'1);
        
// Force cookies for session  (phpsessionID forbidden in URL)
        
ini_set('session.use_only_cookies'1);
        if (!
session_id()){
            
// Prevent php to use sessionID in URL if cookies are disabled.
            
ini_set('session.use_trans_sid'false);
            
session_start(); 
        }
    } 

    
// initialize session
    
public static function init()
    {
        if (!isset(
self::$_instance)) {
            
self::$_instance = new Session();
        }
    }

    
// Returns the IP address, user agent and language of the client
    // (Used to prevent session cookie hijacking.)
    
private static function _allInfos()
    {
        
$infos $_SERVER["REMOTE_ADDR"];
        if (isset(
$_SERVER['HTTP_X_FORWARDED_FOR'])) {
            
$infos.=$_SERVER['HTTP_X_FORWARDED_FOR'];
        }
        if (isset(
$_SERVER['HTTP_CLIENT_IP'])) {
            
$infos.='_'.$_SERVER['HTTP_CLIENT_IP'];
        }
        
$infos.='_'.$_SERVER['HTTP_USER_AGENT'];
        
$infos.='_'.$_SERVER['HTTP_ACCEPT_LANGUAGE'];
        return 
sha1($infos);
    }
 
    
// Check that user/password is correct and init some SESSION variables.
    
public static function login($login,$password,$login_test,$password_test,
                                 
$pValues = array())
    {
        foreach (
$pValues as $key => $value) { 
            
$_SESSION[$key] = $value
        } 
        if (
$login==$login_test && $password==$password_test){
            
// generate unique random number to sign forms (HMAC)
            
$_SESSION['uid'] = sha1(uniqid('',true).'_'.mt_rand());
            
$_SESSION['info']=Session::_allInfos(); 
            
$_SESSION['username']=$login;
            
// Set session expiration.
            
$_SESSION['expires_on']=time()+Session::$inactivity_timeout;
            return 
true;
        }
        return 
false;
    }
 
    
// Force logout
    
public static function logout()
    {
        unset(
$_SESSION['uid'],$_SESSION['info'],$_SESSION['expires_on']);
    } 

    
// Make sure user is logged in.
    
public static function isLogged()
    {
        if (!isset (
$_SESSION['uid'])
            || 
$_SESSION['info']!=Session::_allInfos()
            || 
time()>=$_SESSION['expires_on']){
            
Session::logout();
            return 
false;
        }
        
// User accessed a page : Update his/her session expiration date.
        
$_SESSION['expires_on']=time()+Session::$inactivity_timeout;  
        return 
true;
    }

    
// Returns a token.
    
public static function getToken()
    {
        if (!isset(
$_SESSION['tokens'])){
            
$_SESSION['tokens']=array();
        }
        
// We generate a random string and store it on the server side.
        
$rnd sha1(uniqid('',true).'_'.mt_rand());
        
$_SESSION['tokens'][$rnd]=1;  
        return 
$rnd;
    }

    
// Tells if a token is ok. Using this function will destroy the token.
    // return true if token is ok.
    
public static function isToken($token)
    {
        if (isset(
$_SESSION['tokens'][$token]))
        {
            unset(
$_SESSION['tokens'][$token]); // Token is used: destroy it.
            
return true// Token is ok.
        
}
        return 
false// Wrong token, or already used.
    
}
}
 
?>

Comments

1 - @ - Nemo

Bonjour Tontof,
Je tente d'utiliser ta classe Session, mais je ne comprends pas comment ni où exactement utiliser la fonction login(). Mais surtout que dois-je mettre dans le paramètre $pValues ?
Aurais-tu un petit exemple de site minimaliste qui utiliserais ta classe?
Merci de tes lumières!
Nemo

2 - @ - Tontof

New comment







 __        __   __   ___ 
/  \ |  / |  \ /  \   |  
| /| |_/  |__/ |  |   |  
|/ | | \  |    | \|   |  
\__/ |  \ |    \__\   |