Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/11/2010, 21h37   #1
Invité de passage
 
Inscription : novembre 2010
Messages : 9
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 9
Points : 1
Points : 1
Par défaut Espace membre et sessions

Bonsoir, (je poste au bon endroit?)

Je débute en PHP et je fais quelques tests en local dans le but de me faire un petit script de connexion pour mon site. Voici le code:

Formulaire de connexion:
Code :
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
68
69
70
71
72
73
74
75
76
77
78
<?php
session_start();
?>
//ici j'ai mis la fonction genClef qui permet de générer aléatoirement une très grande chaîne de caractères
<?php
 
try //test de la connexion
{
	$bdd = new PDO('mysql:host=localhost;dbname=test','root',''); //connexion
}
catch (Exception $e)
{
	die('Erreur : '.$e->getMessage()); // si la connexion échoue, on renvoie un message d'erreur au lieu d'afficher le code php
}
if(isset($_POST['pseudo']) AND isset($_POST['passe']))
{
 
	$requete = $bdd->prepare('SELECT COUNT(*) FROM membre WHERE pseudo = ?');
    $requete->execute(array($_POST['pseudo']));
	$nombreDeLignes = $requete->fetch(); // Récupère le résultat du calcul
 
	if ($nombreDeLignes[0] == 0) // on teste le nombre de ligne: si il est egal à 0, le pseudo n'exite pas
    {
        echo 'Pseudo incorrect';
    }
    else
    {
		$requete = $bdd->prepare('SELECT passe FROM membre WHERE pseudo = ?');
		$requete->execute(array($_POST['pseudo']));
		$reponse = $requete->fetch();
 
        if ($_POST['passe'] == $reponse['passe'])
		{
 
			$clefIdentifianteUnique = genClef(); //génère une clef identifiante unique grâce à la fonction genClef
			echo $clefIdentifianteUnique;
 
			$requete = $bdd->prepare('INSERT INTO clefIdentifianteUnique (clefIdentifianteUnique) Values(?)'); //enregistre la clef dans la bdd
			$requete->execute(array($clefIdentifianteUnique));
 
			$requete = $bdd->prepare('SELECT id FROM clefIdentifianteUnique WHERE clefIdentifianteUnique = ?'); //récupère l'id de la clef
			$requete->execute(array($clefIdentifianteUnique));
			$reponse = $requete->fetch();
 
			$pseudoId = $_POST['pseudo'] . $reponse['id']; //crée une variable composée du pseudo et de l'id de la clef
			echo $pseudoId;
 
			$requete = $bdd->prepare('UPDATE clefIdentifianteUnique SET pseudoId = ? WHERE clefIdentifianteUnique = ?'); //enregistre la variable dans la bdd
			$requete->execute(array($pseudoId, $clefIdentifianteUnique));
 
			$_SESSION['clefIdentifianteUnique'] = $clefIdentifianteUnique; //enregistre le code et le pseudo dans des variables de session
			$_SESSION['pseudo'] = $_POST['pseudo'];
			$_SESSION['pseudoId'] = $pseudoId;
 
			echo '<a href="espaceMembre.php">Espace membre</a>';
 
			echo 'Bonne navigation<br/>';
			echo $_POST['pseudo'];
		}
		else
		{
			echo 'Mot de passe incorrect';
		}
    }
 
	$requete->closeCursor();
}
else
{
	echo 'ERREUR';
}
?>
 
<form method="post" action="index.php">
<input name="pseudo" type="text" value="Pseudo"><br/>
<input name="passe" type="password" value="Mot de passe"><br/>
<input type="submit" value="Valider"/><br/>
</form>
Et l'espace membre (qui est destiné à se remplir):

Code :
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
<?php
if(!isset($_SESSION))
{
	session_start();
 
 
	try //test de la connexion
	{
		$bdd = new PDO('mysql:host=localhost;dbname=test','root',''); //connexion
	}
	catch (Exception $e)
	{
		die('Erreur : '.$e->getMessage()); // si la connexion échoue, on renvoie un message d'erreur au lieu d'afficher le code php
	}
 
	$requete = $bdd->prepare('SELECT clefIdentifianteUnique FROM clefIdentifianteUnique WHERE pseudoId = ?');
	$requete->execute(array($_SESSION['pseudoId']));
 
	$reponse = $requete->fetch();
 
	if ($reponse['clefIdentifianteUnique'] == $_SESSION['clefIdentifianteUnique'])
	{
		echo $_SESSION['clefIdentifianteUnique'];
		echo $_SESSION['pseudo'];
	}
	else
	{
		echo 'Accès refusé';
	}
}	
else
{
	echo 'ARGG';
}
	?>
Seulement lorsque j'essaie d'accéder à mon espace membre sans passer par le formulaire, au lieu d'avoir le messages d'erreur j'ai:
Citation:
Notice: Undefined index: pseudoId in*E:\Program Files\wamp\www\test\espaceMembre.php*on line*17

Notice: Undefined index: clefIdentifianteUnique in*E:\Program Files\wamp\www\test\espaceMembre.php*on line*21

Notice: Undefined index: clefIdentifianteUnique in*E:\Program Files\wamp\www\test\espaceMembre.php*on line*23

Notice: Undefined index: pseudo in*E:\Program Files\wamp\www\test\espaceMembre.php*on line*24
Ce qui veut dire que PHP lit le code même avec le if. Donc je sais pas si j'ai loupé quelque chose ou si j'utilise mas les sessions, mais je ne trouve pas de solution.

Sinon que pensez-vous de ce script? Est-ce assez sécurisé? (j'ai du mal à me rendre compte du niveau de sécurité qu'offrent les sessions).

Merci pour votre aide!
Stormy68 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2010, 22h26   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
C'est plutot un test dans ce genre qu'il te faut :
Code :
1
2
3
4
 
session_start();
if(!isset($_SESSION['clefIdentifianteUnique'])
{
Sinon je ne vois pas pas bien ce qu'apporte ta clef supplementaire en session comme sécurité.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2010, 22h32   #3
Invité de passage
 
Inscription : novembre 2010
Messages : 9
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 9
Points : 1
Points : 1
Je vais essayer merci!

L'intérêt de la clef et de ne pas transmettre le mot de passe qui reste bien au chaud dans la bdd, d'autant plus qu'il n'est pas encore hasché. Après je suis peut être un peu trop parano.
Mais comme j'ai pas vraiment compris comment les sessions transmettent les variables, je préfère sécuriser au maximum. J'ai lu que les sessions peuvent utiliser des cookies par exemple. Dans ce cas le mot de passe serait exposé aux pirates, non?
Stormy68 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2010, 22h44   #4
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Les données des sessions sont stockés sur le serveur.
Le cookie fait le lien entre l'utilisateur et sa session sur le serveur.

Il n'y a de toute facon pas d'interet a stocker le mot de passe en session puisqu'il n'y a pas d'interet a re-controler le mot de passe (ou n'importe quel autre élément) a chaque page.

Ce qui est interessant par contre est de regenerer la session lorsque l'utilisateur change de niveau d'accès (authentification, changement de mot de passe etc.).
En effet une technique de vol d'accès consiste a voler la session de l'utilisateur puis de l'inciter a se connecter sur le site (faux lien etc.).
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2010, 22h58   #5
Invité de passage
 
Inscription : novembre 2010
Messages : 9
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 9
Points : 1
Points : 1
En quoi consiste le vol de session?
Stormy68 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2010, 23h28   #6
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Cela consiste a recuperer l'identifiant de session (stocké dans un cookie ou dans l'url).
Le voleur peut alors usurper l'accès de l'utilisateur.

Pour renforcer la sécurité, on peut controler que les informations de l'utilisateur (navigateur, adresse ip, systeme d'exploitation etc.) ne changent pas au cours de la session, ce qui laisserait supposer que l'utilisateur a changé.
http://guillaume-affringue.developpe...rement/?page=4
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2010, 23h23   #7
Invité de passage
 
Inscription : novembre 2010
Messages : 9
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 9
Points : 1
Points : 1
Merci beaucoup!

Ca devrait résoudre mon problème et renforcer mes maigres bases en PHP
Stormy68 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 22h04   #8
Invité de passage
 
Inscription : novembre 2010
Messages : 9
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 9
Points : 1
Points : 1
Après la lecture du très bon et complet dossier sur les techniques de protection, j'ai décidé d'adapter le système du ticket à mon cas. J'en ai profiter pour corriger les très nombreuses erreurs et futilités de mon code.

Code :
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
68
69
70
71
<?php
session_start();
?>
 
<form method="post" action="index.php">
<input name="pseudo" type="text" value="Pseudo"><br/>
<input name="passe" type="password" value="Mot de passe"><br/>
<input type="submit" value="Valider"/><br/>
</form>
<a href="espaceMembre.php">Espace Membre</a>
<?php
 
try //test de la connexion
{
	$bdd = new PDO('mysql:host=localhost;dbname=test','root',''); //connexion
}
catch (Exception $e)
{
	die('Erreur : '.$e->getMessage()); // si la connexion échoue, on renvoie un message d'erreur au lieu d'afficher le code php
}
if(isset($_POST['pseudo']) AND isset($_POST['passe']))
{
 
	$requete = $bdd->prepare('SELECT COUNT(*) FROM membre WHERE pseudo = ?');
    $requete->execute(array($_POST['pseudo']));
	$nombreDeLignes = $requete->fetch(); // Récupère le résultat du calcul
 
	if ($nombreDeLignes[0] == 0) // on teste le nombre de ligne: si il est egal à 0, le pseudo n'exite pas
    {
        echo 'Pseudo incorrect';
    }
    else
    {
		$requete = $bdd->prepare('SELECT passe FROM membre WHERE pseudo = ?');
		$requete->execute(array($_POST['pseudo']));
		$reponse = $requete->fetch();
 
        if ($_POST['passe'] == $reponse['passe'])
		{
 
			$clefIdentifianteUnique = genClef(); //génère une clef identifiante unique grâce à la fonction genClef
			//echo $clefIdentifianteUnique;
			setcookie('pseudo',$clefIdentifianteUnique, time() + 3600, null, null, false, true);
 
			$ticketIdentifiantUnique = genClef();
			setcookie('ticket',$ticketIdentifiantUnique, time() + 3600, null, null, false, true);
			$_SESSION['ticket'] = $ticketIdentifiantUnique;
$_SESSION['clefIdentifianteUnique'] = $clefIdentifianteUnique; //enregistre le code et le pseudo dans des variables de session
			$_SESSION['pseudo'] = $_POST['pseudo'];
 
 
 
 
			echo '<a href="espaceMembre.php">Espace membre</a><br/>';
 
			echo 'Bonne navigation<br/>';
			echo $_POST['pseudo'];
		}
		else
		{
			echo 'Mot de passe incorrect';
		}
    }
 
	$requete->closeCursor();
}
else
{
	echo 'ERREUR';
}
?>
Code :
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
 
<?php
session_start();
if(isset($_SESSION['clefIdentifianteUnique']))
{
	if($_COOKIE['pseudo'] = $_SESSION['clefIdentifianteUnique'] AND $_COOKIE['ticket'] = $_SESSION['ticket'])
	{
		//echo $_SESSION['clefIdentifianteUnique'];
		//echo $_SESSION['pseudo'];
		//echo $_COOKIE['pseudo'];
                $ticketIdentifiantUnique = genClef();
		setcookie('ticket',$ticketIdentifiantUnique, time() + 3600, null, null, false, true);
		$_SESSION['ticket'] = $ticketIdentifiantUnique;
 
                $membre = true;
	}
	else
	{
		echo 'Accès refusé<br/>';
		echo '<a href=index.php">Connexion</a>';
	}
}
else
{
	echo 'Veuillez vous connecter<br/>';
	echo '<a href=index.php">Connexion</a>';
}
	?>
Qu'en pensez vous?
Stormy68 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h33.


 
 
 
 
Partenaires

Hébergement Web