IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Session et Securité


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Points : 135
    Points
    135
    Par défaut Session et Securité
    Bonjour à tous.
    Je suis sur la fin de projet d'un CMS, et je fais un relecture pour vérifier la sécurité de mes pages.
    je me suis aperçu que mes session étaient gérées uniquement par un session_start() dès le simple visiteur.
    j'ai donc fais un petit script qui permet de faire une autentification de session plus complète.

    Je voudrais savoir ce que vous en pensez.
    Est-ce suffisant, sachant que j'utilise des variables de session pour les différents acces ( par exemple pour admin: if ($_SESSION['level'] > 2) ...), dans des requetes sql (par exemple SELECT * FROM 'matable' WHERE level <= $_SESSION['level']) ou encore pour reperer l'auteur d'un messages / news ... (par exemple if ($donnees['auteur'] == $_SESSION['pseudo'])

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    <?php
    //definir les robots connu dans un array
    $robotsarray = array(
       "Googlebot", 
       "Slurp", 
       "Fast", 
       "Scooter", 
       "VoilaBot", 
    );
    $isrobot = false; 
     
    //Verifier si le visiteur est un robot connu
    foreach($robotsarray as $spider)  { 
       if (eregi($spider, $_SERVER['HTTP_USER_AGENT'])) { 
          $isrobot = true;
          break; 
       }
    }
     
    //si ce n'est pas le cas, on démarre la session
    if(!$isrobot){
    	session_start();
    	//ici on crée/verifie une variable d'identification (hachage de l'id du site(unique) + user_agent)
    	if (!isset($_SESSION[CONFIGNAME]['initiated']))
    	{
    	    session_regenerate_id();
    	    $_SESSION[CONFIGNAME]['initiated'] = true;
    	}
    	if (isset($_SESSION[CONFIGNAME]['HTTP_USER_AGENT']))
    	{
    	    if ($_SESSION[CONFIGNAME]['HTTP_USER_AGENT'] != md5($config_siteID.$_SERVER['HTTP_USER_AGENT']))
    	    {
    	        //la variable est differente de celle enregistrée précedement: erreur -> retour au login
    	        session_destroy();
    			header("Location: index.php?com=users&option=login&autherror");
    	    }
    	}
    	else
    	{
    	    //si la variable n'existe pas, on la crée (première visite)
    	    $_SESSION[CONFIGNAME]['HTTP_USER_AGENT'] = md5($config_siteID.$_SERVER['HTTP_USER_AGENT']);
    	}
    	//si un nom d'utilisateur est defini, on verifie une seconde varaible definie lors du login
    	if(isset($_SESSION[CONFIGNAME]['pseudo']) OR isset($_SESSION[CONFIGNAME]['id']) OR isset($_SESSION[CONFIGNAME]['level']))
    	{
    		if (isset($_SESSION[CONFIGNAME]['user_session']))
    		{
    		    //Ne faites pas attention a ça; c'est simplement ma fonction sql.
    		    $req_user = $db->select('users', 'WHERE id="'.intval($_SESSION[CONFIGNAME]['id']).'" AND username="'.mysql_real_escape_string(htmlspecialchars($_SESSION[CONFIGNAME]['pseudo'])).'" AND level="'.intval($_SESSION[CONFIGNAME]['level']).'"');
    			if(is_array($req_user))
    			$user = $req_user[0];
    			if ($_SESSION[CONFIGNAME]['user_session'] != sha1($user['register_date'].$user['password'].$user['register_ip']))
    		    {
    		        session_destroy();
    				header("Location: index.php?com=users&option=login&autherror");
    				die();
    		    }
    		}
    		else
    		{
    		    session_destroy();
    			header("Location: index.php?com=users&option=login&autherror");
    			die();
    		}
    	}
    }
    ?>
    Voila

    Pour finir, je voulais également demander quel sont les différent point de sécurité à vérifier, et si possible des petits liens.
    j'ai déjà verifier ces differents points:
    -les variables ( intval / htmlspecialchars/ mysql_real_esxape_string ...)
    => les magicquote dispence du addslashes non ?
    -inclusions (toutes mes inclusions sont fixes, aucun include($var.'.php'); )
    -mes requetes sql


    Voila voia. Merci d'avance

  2. #2
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    si tu ne veux pas t'embêter et avoir une sécu solide, alors tu peux utiliser PEAR et ces packages http://pear.php.net/packages.php?cat...cation&php=all

    j'utilise Auth car il est solide et simple.


    je comprends pas pourquoi tu utilises le USER_AGENT dans ton authentification, REMOTE_ADDR est grandement préferable !


    concernant les magicquote : tu dois dans TOUS les cas prévoir son activation ou sa desactivation, faut créer une méthode en conséquence car la config change d'un serveur a l'autre

  3. #3
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Points : 135
    Points
    135
    Par défaut
    J'utilise le user_agent, car bien que ça soit moins "unique" que l'adresse ip, je peux également l'utiliser pour mes cookies, puisqu'il changera moins souvent qu'une adresse ip. je pourrais aussi utiliser REMOTE_HOST limite.

    Pour le magic quote, j'y ai pensé, et j'ai fais un petit script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    function secure($var, $type)
    {
    	if ($type == "int")
    	{
    		if(is_int($var) or empty($var))
    		return intval($var);
    		else
    		alert_admin($var.' '.$type);
    	}
    	elseif($type == "string")
    	{
    		if(is_string($var) or empty($var))
    		{
    			if(get_magic_quotes_gpc() == 1)
    			{
    				return mysql_real_escape_string(htmlspecialchars(sripslashes($var)));
    			}
    			else
    			{
    				return mysql_real_escape_string(htmlspecialchars($var));
    			}
    		}
    		else
    		{
    			alert_admin($var.' '.$type);
    		}
     
    	}
    }
    pas fini encore, mais ça fonctionne

    Sinon pour le pear je vais allé voir ça
    Merci

  4. #4
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    Citation Envoyé par xxkirastarothxx Voir le message
    J'utilise le user_agent, car bien que ça soit moins "unique" que l'adresse ip, je peux également l'utiliser pour mes cookies, puisqu'il changera moins souvent qu'une adresse ip
    user_agent peut être changé a volonté par le client (FF/Opera/...), par contre REMOTE_ADDR est lié a son IP, si son IP change, tanpis, il devra se reconnecter ..
    question sécu REMOTE_ADDR est plus solide, le mieux reste l'adresse MAC (adresse propre a chaque carte réseau) mais tu l'utilises que sur les réseau intranet ayant un gros besoin de sécu (et encore, ya toujours moyen de contourner...)



    pour les magic_quotes, j'utilise ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    get_magic_quotes_gpc() ? $stSource = stripslashes($stSource) : '';


    pour ta condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(is_string($var) or empty($var))
    juste avant tu fais un test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    elseif($type == "string")
    il n'y a pas redondance et incohérence ?

  5. #5
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Points : 135
    Points
    135
    Par défaut
    Pour le user_agent, c'est pas si important: c'est une vérification pour les utilisateurs non logué, je ne pense même pas la laisser ça sert a rien de verifier l'authenticité d'un visiteur non logué.
    J'ai une seconde vérification bien plus pointu si l'utilisateur est repéré comme un utilisateur logué. (à base de son mot de passe, de sont ip d'enregistrement et de son timestamp d'enregistrement)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sha1($user['register_date'].$user['password'].$user['register_ip'])
    Précision: $user['password'] est déjà en md5

    Pour l'adresse mac, effectivement ça ne fonctionnerai que sur de l'intranet, peu d'intérêt pour un CMS; et puis l'adresse mac est unique... en théorie oui, mais bon, c'est vraiment pas si compliqué de la changer avec un minimum de connaissance; et en général les attaquants en ont un minimum
    pour ta condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(is_string($var) or empty($var))
    juste avant tu fais un test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    elseif($type == "string")
    il n'y a pas redondance et incohérence ?
    Bah heu... non ... -> function secure($var, $type)
    par exemple, imaginons la fonction:
    secure($_GET['username'], "string");
    $_GET['username'] DOIT être une string (puisque je précise $type = "string", mais il est possible que ça ne soit pas le cas (si un utilisateur met &username=1 par exemple), c'est donc ce que je vérifie.

    la redondance c'est plus dans la seconde partie du script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(is_int($var) or empty($var))
    return intval($var);
    "if(is_int .... return intval...)"... là je suis d'accord ça sert a rien ^^

    pour finir, pour ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    get_magic_quotes_gpc() ? $stSource = stripslashes($stSource) : '';
    j'ai déjà vu cette façon de codé, j'arrive a la comprendre, mais je n'y connais rien ^^
    Ca reviens au même en plus cours enfait
    à voir

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JBOSS 5.1] [Session Beans] [Securité]
    Par mkiba dans le forum Wildfly/JBoss
    Réponses: 1
    Dernier message: 06/07/2009, 15h14
  2. [Sécurité] Session et Cookies
    Par amika dans le forum Langage
    Réponses: 3
    Dernier message: 28/09/2005, 22h14
  3. Réponses: 6
    Dernier message: 22/09/2005, 10h21
  4. Réponses: 5
    Dernier message: 19/09/2005, 11h46
  5. Réponses: 2
    Dernier message: 07/09/2005, 16h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo