Hola,
Creo que me enredé demasiado con los
tokens.
Basta guardar una variable de sesión cualquiera en la página que muestra el formulario y preguntar por ella en el
script que procesa el formulario.
Si no existe la variable, consideramos inválida la petición y abortamos. El atacante podrá hacerlo cuantas veces quiera que siempre obtendrá la misma respuesta: "petición no válida".
La única forma que tiene para no obtener dicha respuesta es preservando la sesión, y una vez hecho esto ya lo tenemos amarrado y podemos contar los intentos con una variable de sesión, que, de hecho, puede ser la misma que la otra:
login-form.php
Código PHP:
<?php
session_start();
$_SESSION['intentos'] = 0;
?>
<form method='post' action='login.php'>
<div>
<label for='user'>User</label>
<input type='text' name='user' id='user'>
</div>
<div>
<label for='password'>Pwd</label>
<input type='text' name='password' id='password'>
</div>
<div>
<input type='submit'>
</div>
</form>
login.php
Código PHP:
<?php
session_start();
if (!isset($_SESSION['intentos']))
{
die('Petición no válida');
}
/*
Verificamos los datos de inicio
*/
...
/*
Si son incorrectos, marcamos un intento más
*/
$_SESSION['intentos']++;
/*
Y lo mandamos a volar si ya rebasó el máximo permitido
*/
if ($_SESSION['intentos'] > 3)
{
die('Demasiados intentos');
}
?>
// Saludos