Bonjour,

je souhaite sécuriser la partie administrateur de mon site contre les attaques CSRF, avec la "méthode des jetons".
Pour ceux qui ne savent pas en quoi tout cela consiste :
http://guillaume-affringue.developpe.../?page=4#LIV-B

On peut utiliser cette methode avec un champs de type "hidden" récupérant la valeur du jeton dans un formulaire (très pratique pour entrer dans une partie administrateur avant un formulaire login/password).
J'ai testé cette méthode, et ça fonctionne chez moi (cf. le code ci-dessous).

Le problème c'est qu'il faut comparer le ticket(jeton)(POST ou COOKIE) au ticket de la session à chaque chargement d'une page différente dans la partie administrateur. C'est expliqué dans le lien, pour lequel je n'arrive pas à faire fonctionner le code (avec un cookie donc sans formulaire).

Supposons qu'il y ai une page formulaire.php où l'administrateur entre son login et password, une page traitement_formulaire.php qui traite le formulaire puis renvoi ensuite sur la page admin1.php (si tout est ok) qui est la première page d'administration.

J'ai donc ceci dans la page formulaire.php :
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
<?php
session_start();
$token = md5(uniqid(rand(), true));
$_SESSION[$nom.'_token'] = $token;
$_SESSION[$nom.'_token_time'] = time();
?>
<html>
<head>
<title>Formulaire d'identification</title>
</head>
<body>
<form action="traitement_formulaire.php" method="post">
login  : <input type="text" name="login">
password : <input type="password" name="pwd">
<input type="hidden" name="token" id="token" value="<?php echo $token; ?>"/>
<input type="submit" value="Connexion">
</form>
</body>
</html>
puis traitement_formulaire.php :
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
<?php
$login_valide = "blabla";
$pwd_valide = "blablabla";
 
	// on teste si nos variables sont définies
	if (isset($_POST['login']) && isset($_POST['pwd']))
	{
		// on vérifie le pseudo saisi et le mot de passe
		if ($login_valide == $_POST['login'] && $pwd_valide == $_POST['pwd'])
		{
			session_start ();
			//Vérification du token -> la fonction verifier_token est incluse au début de cette page par une include. Cette fonction verifier_token() est explicitée dans le premier lien.
			if(verifier_token(600, 'http://$$$$$$$$$$$$/formulaire.php', 'forum'))
			{
				//on récupère une nouvelle valeur du token en écrasant la variable, c'est important
				$token = md5(uniqid(rand(), true));
				$_SESSION[$nom.'_token'] = $token;
				$_SESSION[$nom.'_token_time'] = time();
 
 
				// on enregistre les paramètres de notre visiteur comme variables de session ($login et $pwd) 
				$_SESSION['login'] = $_POST['login'];
				$_SESSION['pwd'] = $_POST['pwd'];
 
				// on redirige notre visiteur vers une page de notre section membre
				header ('location: admin1.php');
			}
			else
			{
				echo 'On DECONNECT';
			}
		}
		else
		{
			// Le visiteur n'a pas été reconnu comme étant membre de notre site.
			echo '<body onLoad="alert(\'Membre non reconnu...\')">';
			// puis on le redirige vers la page d'accueil
			echo '<meta http-equiv="refresh" content="0;URL=index.html">';
		}
	}
	else
	{
		echo 'Les variables du formulaire ne sont pas déclarées.';
	}
?>
Voilà, c'est un début (je n'ai rien fait en fait, juste testé que ça fonctionnait bien). Maintenant je ne sais pas comment faire pour avoir un jeton qui se balade dans toute la partie session de l'administration. Il faudrait probablement changer la page traitement_formulaire.php et créer la page admin1.php.

Merci d'avance pour votre aide et les experts sont aussi les bienvenus pour donner leurs avis ou propositions de code .

Ce système de jetons est-il utile pour un envoi de mail par formulaire?
Merci par avance.