Premièrement, merci à toi,
Bonjour,
Je suis pret a regarder ta solution, mais avant d'aller plus loin, tu est bien OK que "afficher/source" donne accés aux input hidden
tout à fait mais le ticket est aléatoire à chaque chargement de page, et le ticket du cookie est comparé à celui de la session à chaque fois pour vérifier l'authenticité de l'administrateur. Je crois aussi que c'est pour obliger l'administrateur à valider le formulaire, pour éviter la provenance de sites pirate extérieurs. C'est mieux expliqué dans les liens, je suis pas expert.
Même avec ce code, j'ai le même problème, ça bloque sur le cookie :
1 2
| if (!isset($_COOKIE["ticket"])) $ticket="";
else $ticket=$_COOKIE["ticket"]; |
Pour la solution que je propose(et qui ne marche pas donc), voici la page traitement_formulaire.php changée et admin1.php créée :
traitement_formulaire :
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
|
<?php //traitement_formulaire.php
$login_valide = "blabla";
$pwd_valide = "blablabla";
include ("securite.php");
// 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://localhost/CSRF/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();
//création/écrasement du cookie pour la partie interne de l'administration
$token = uniqid(strval(mt_rand(1, 999999)));
setcookie('forum_token', $token, 300);
$_SESSION['forum_token'] = $token;
// 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.';
}
?> |
admin1.php :
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
|
<?php //admin1.php
// On démarre la session (ceci est indispensable dans toutes les pages de notre section membre)
session_start ();
include ("securite.php");
// On récupère nos variables de session
if (isset($_SESSION['login']) && isset($_SESSION['pwd']))
{
if(verifier_token_admin(5, 'http://localhost/$$$$/traitement_formulaire.php', 'forum'))
{
// On le renouvelle en l'écrasant
$token = uniqid(strval(mt_rand(1, 999999)));
setcookie($nom.'_token', $token, 300);
$_SESSION[$nom.'_token'] = $token;
// On affiche un lien pour fermer notre session
echo '<a href="./logout.php" >Déconnexion</a>';
}
else
{
echo 'On DéCONNECT';
}
}
else
{
echo 'Les variables ne sont pas déclarées.';
}
?> |
le fichier securite.php au passage :
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 79 80 81 82 83
|
<?php //securite.php
//Cette fonction génére, sauvegarde et retourne un token
//Vous pouvez lui passer en paramètre optionnel un nom pour différencier les formulaires
function generer_token($nom = '')
{
//session_start();
$token = md5(uniqid(rand(), true));
$_SESSION[$nom.'_token'] = $token;
$_SESSION[$nom.'_token_time'] = time();
// $_COOKIE[$nom.'_token'] = $token; //à ne pas oublier dans vérifier_token_admin!!!
return $token;
}
//**********************************************************************************************************************************-//
//**********************************************************************************************************************************-//
//**********************************************************************************************************************************-//
//Cette fonction vérifie le token
//Vous passez en argument le temps de validité (en secondes)
//Le referer attendu (adresse absolue, rappelez-vous :D)
//Le nom optionnel si vous en avez défini un lors de la création du token
function verifier_token($temps, $referer, $nom = '')
{
//session_start();
if(isset($_SESSION[$nom.'_token'], $_SESSION[$nom.'_token_time'], $_POST['token']))
{
if($_SESSION[$nom.'_token'] == $_POST['token'])
{
$timestamp_ancien = time() - $temps;
if($_SESSION[$nom.'_token_time'] >= $timestamp_ancien)
{
if($_SERVER['HTTP_REFERER'] == $referer)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
else
{
return false;
}
}
else
{
return false;
}
}
//**********************************************************************************************************************************-//
//**********************************************************************************************************************************-//
//**********************************************************************************************************************************-//
//Cette fonction vérifie le token
//Vous passez en argument le temps de validité (en secondes)
//Le referer attendu (adresse absolue, rappelez-vous :D)
//Le nom optionnel si vous en avez défini un lors de la création du token
function verifier_token_admin($temps, $referer, $nom = '')
{
//session_start();
if (!isset($_COOKIE["ticket"]))
{
return false;
}
else
{
return true;
}
}
?> |
je recopie le fichier formulaire.php pour plus de clarté :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
<?php //formulaire.php
session_start();
include ("securite.php");
$token = generer_token('forum');
?>
<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> |
Tenez-vous en à ces 4 derniers fichiers, c'est là où j'en suis.
A ce stade une fois le login/password rentrés, le navigateur m'affiche la page admin1.php avec écrit : "On DéCONNECT ". Cela veut bien dire que le traitement du formulaire (et du jeton du formulaire avec) a bien été traité. ça bloque donc ici dans la fonction verifier_token_admin() dans le fichier securite.php :
if (!isset($_COOKIE["ticket"]))
le cookie n'exiterai pas???!!.
Je précise que ça correspond à :
if(verifier_token_admin(5, 'http://localhost/$$$$/traitement_formulaire.php', 'forum'))
du fichier admin1.php.
Et je ne sais pas pourquoi.
Partager