Partage
  • Partager sur Facebook
  • Partager sur Twitter

Systeme de sessions

artisanat

    20 février 2006 à 12:58:25

    Bonjour,
    j'ai essayé de faire un système de connexion alternatif a la fonction session_start(). Il me semble qu'au niveau securité il y a pas de faille mais j'aimerai avoir votre avis pour limiter au maximum le risque de faille de securité.

    Il y a 2 table dans la base de donnée qui servent a la connection :

    Table utilisateur :

    CREATE TABLE `utilisateur` (
      `id_utilisateur` int(11) NOT NULL AUTO_INCREMENT,
      `login` varchar(30) NOT NULL DEFAULT '',
      `nom` varchar(30) NOT NULL DEFAULT '',
      `prenom` varchar(30) NOT NULL DEFAULT '',
      `mail` varchar(30) NOT NULL DEFAULT '',
      `pass` varchar(32) NOT NULL DEFAULT '',
      `invite` tinyint(1) NOT NULL DEFAULT '0',
      `date_inscription` int(11) NOT NULL DEFAULT '0',
      `date_naissance` int(11) NOT NULL DEFAULT '0',
      `admin` tinyint(1) NOT NULL DEFAULT '0',
      `design` int(11) NOT NULL DEFAULT '0',
      PRIMARY KEY  (`id_utilisateur`,`login`)
    ) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;



    Table session :

    CREATE TABLE `session` (
      `id_session` int(11) NOT NULL AUTO_INCREMENT,
      `id_utilisateur` int(11) NOT NULL DEFAULT '0',
      `ip` varchar(15) NOT NULL DEFAULT '',
      `cookie` varchar(32) NOT NULL DEFAULT '',
      `date` int(11) NOT NULL DEFAULT '0',
      `fini` tinyint(1) NOT NULL DEFAULT '0',
      PRIMARY KEY  (`id_session`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;


    Code de connexion
    : on commence par verifier le mot de passe et le login, si il est bon on genere une clé unique qui va servir a proteger la session. On ajoute dans la table session la nouvelle session avec l'id de l'utilisateur, son ip, et la clé. Puis on envoie la cle chez l'utilisateur sous forme de cookie.


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

          $mysql_result=mysql_query('SELECT id_utilisateur FROM utilisateur WHERE login=\''.$_POST['login'].'\' AND pass=\''.md5($_POST['pass']).'\' ;');

          if(mysql_num_rows($mysql_result)==1)
          {
              $id_login=mysql_fetch_array($mysql_result);
              $id_login=$id_login['id_utilisateur'];
              $cookie=md5(microtime());
              mysql_query('INSERT INTO session VALUES(\'\',\''.$id_login.'\',\''.get_ip().'\',\''.$cookie.'\','.time().',0)');
              setcookie("b219_cle_session",$cookie,time()+3600*24*365);
              header("Location: index.php");

          }
          else
          {
           header("Location: index.php");
          }

      }


    Code de verification de connexion : cette fonction est appelé au debut de chaque page, un peut comme le session_start. On commence par recuperer le cookie et l'ip. On recherche les session encore actives qui on la bonne clé par rapport a l'ip. Il y a une chance sur 1.46*10^48 que 2 personne se retrouve avec la meme clé et la meme ip. Si il y a une session correspondante on renvoie l'id de l'utilisateur et celui ci ce trouve loggé.


        function login()
        {
             $ip = get_ip(); // récupération de l'ip de l'utilisateur

            // récupération du cookie de securité
            if(empty($_COOKIE['b219_cle_session']))
            {
                  $cle_session = "";
            }
            else
            {
                $cle_session = $_COOKIE['b219_cle_session'];
            }

            // Recuperation des session correspondante
            $mysql_sol=mysql_query('SELECT id_utilisateur FROM session WHERE ip=\''.$ip.'\' AND cookie=\''.$cle_session.'\' AND fini=0;');

            if(mysql_num_rows($mysql_sol)==1)
            {
                    $mysql_sol=mysql_fetch_array($mysql_sol);

            return $mysql_sol['id_utilisateur'];
            }
            else
            {
                    return 0;
                    }

        }


    Code de deconnexion : On met a jour le champ fini de la session correspondante. session() et la meme fonciton que login() a par qu'elle renvoie l'id_sesssion au lieu de id_utilisateur.


    mysql_query("UPDATE `session` SET `fini` = '1' WHERE `id_session` =".session()." ;");


    Voila le principe ... il marche bien dans une utilisation normale mais justement, y a-t-il des situations anormales ou on pourrait se connexion sans avoir le droit ?

    merci :)
    • Partager sur Facebook
    • Partager sur Twitter
      21 février 2006 à 21:09:38

      un petit up désépéré ...:'(
      • Partager sur Facebook
      • Partager sur Twitter
        21 février 2006 à 21:14:53

        Ca m'a l'air corect à premierre vue mais pourquoi ne pas utiliser les sessions? o_O
        • Partager sur Facebook
        • Partager sur Twitter

        Systeme de sessions

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown