La cuestion es, realicé un sistema simple para que al tener X intentos de login, le bloquee el acceso, o asi lo tenia pensado, la cosa es...
Como puedo restringir ese acceso por ejemplo.. 5 minutos?, y que luego en la pagina ponga "Te quedan X minutos de restriccion" ?
El codigo que hice hasta ahora sobre esto es el siguiente:
<?php
function Redirect($url, $permanent = false) {
header('Location: ' . $url, true, $permanent ? 301 : 302);
exit();
}
?>
<html>
<head>
<title>VeNaD PHP Testing</title>
<style> * {margin-left:1%;font-family:Verdana, Geneva, sans-serif} </style>
</head>
<?php
session_start();
if (!isset($_SESSION['tryes'])) {
$_SESSION['tryes'] = 0;
}
if (isset($_GET['login']) && isset($_POST['u']) && isset($_POST['p'])) {
$_POST['u'] = htmlspecialchars($_POST['u']);
$_POST['p'] = htmlspecialchars($_POST['p']);
if (strlen($_POST['u']) > 5) {
if (strlen($_POST['p']) > 5) {
$_SESSION['ejemplo'] = array();
$_SESSION['ejemplo']['u'] = $_POST['u'];
$_SESSION['ejemplo']['p'] = $_POST['p'];
$_SESSION['tryes'] = 0;
Redirect("https://www.venad.cf/host/index.php");
} else {
echo("Tu contraseña debe contener 6 o mas caracteres");
$_SESSION['tryes'] = $_SESSION['tryes'] + 1;
}
} else {
echo("Tu usuario debe contener 6 o mas caracteres");
$_SESSION['tryes'] = $_SESSION['tryes'] + 1;
}
} elseif (isset($_GET['login']) && !isset($_POST['u']) && !isset($_POST['p'])) {
echo("Error al loggearte, prueba de nuevo<br>");
$_SESSION['tryes'] = $_SESSION['tryes'] + 1;
}
if (isset($_GET['logout']) && !isset($_GET['login']) && isset($_SESSION['ejemplo']['u']) && isset($_SESSION['ejemplo']['p'])) {
session_destroy();
session_unset();
Redirect("https://www.venad.cf/host/index.php");
} elseif (isset($_GET['login']) or isset($_GET['logout'])) {
Redirect("https://www.venad.cf/host/index.php");
}
?>
<body>
<?php
if (!isset($_SESSION['tn6loggeado'])) {
echo("<form action=\"index.php?login\" method=\"POST\">
Usuario:<br>
<input type=\"text\" name=\"u\">
<br>
Contraseña:<br>
<input type=\"password\" name=\"p\">
<br><br>
<input type=\"submit\" value=\"Login\">
</form>");
if (isset($_SESSION['tryes']) && $_SESSION['tryes'] > 0) {
echo ("<br> Comprueba tus datos de acceso, intento numero {$_SESSION['tryes']} / 3");
}
}
elseif (isset($_SESSION['ejemplo'])) {
echo("Tu usuario es este: {$_SESSION['tn6loggeado']['usuario']} <br><br>");
echo("Tu contraseña es esta: {$_SESSION['tn6loggeado']['password']}<br><br>");
echo("<a href=\"./index.php?logout\"><button>Cerrar sesion</button></a><br><br>");
}
?>
Está separado porque uno es interno y otro funciona para mostrar al cliente la informacion
Un par de cosillas:
No se debe usar la funcion header despues de haber enviado contenido web. La alternativa a eso es usar la funcion header para redirigir con unos segundos de retraso, y luego muestras el contenido web.
Para restringir el acceso puedes hacerlo de varias formas. La mas simple es que si se producen 10 intentos de acceso erroneos se guarden en una base de datos la IP del cliente y la hora en la que se hizo el ultimo login, esa tabla la llamaremos "lista negra".
Cada vez que se intente hacer login buscamos la IP del cliente en la lista negra:
Si no se encuentra => dejamos paso libre.
Si se encuentra => obtenemos el valor de la ultima hora registrada y:
Si difiere en menos de 600segundos (10 minutos) => mostramos pagina de bloqueo.
Si no => dejamos paso libre.
Cita de: joecarl en 28 Julio 2015, 11:44 AM
Un par de cosillas:
No se debe usar la funcion header despues de haber enviado contenido web. La alternativa a eso es usar la funcion header para redirigir con unos segundos de retraso, y luego muestras el contenido web.
Para restringir el acceso puedes hacerlo de varias formas. La mas simple es que si se producen 10 intentos de acceso erroneos se guarden en una base de datos la IP del cliente y la hora en la que se hizo el ultimo login, esa tabla la llamaremos "lista negra".
Cada vez que se intente hacer login buscamos la IP del cliente en la lista negra:
Si no se encuentra => dejamos paso libre.
Si se encuentra => obtenemos el valor de la ultima hora registrada y:
Si difiere en menos de 600segundos (10 minutos) => mostramos pagina de bloqueo.
Si no => dejamos paso libre.
Hnm, y que pasa si lo dejo de esta manera?
<?php
function Redirect($url, $permanent = false) {
header('Location: ' . $url, true, $permanent ? 301 : 302);
exit();
}
?>
<html>
<head>
<title>vDNet ||</title>
<style> * {margin-left:1%;font-family:Verdana, Geneva, sans-serif} </style>
</head>
<body>
<?php
session_start();
if (!isset($_SESSION['tryes'])) {
$_SESSION['tryes'] = 0;
}
if (isset($_SESSION['lasttime'])) {
if ($_SESSION['lasttime'] - (time() + 60) < 1) {
session_destroy();
session_unset();
Redirect("https://www.venad.cf/srv/host/index.php");
}
}
if ($_SESSION['tryes'] >= 3 && isset($_SESSION['lasttime'])) {
$minutos = floor(($_SESSION['lasttime'] - (time() + 60))/60);
$sec = $_SESSION['lasttime'] - (time() + 60);
while ($sec > 60) {
$sec = $sec - 60;
}
if (($minutos + $sec) > 0) {
if (isset($_GET['login']) or isset($_GET['logout'])) {
Redirect("https://www.venad.cf/srv/host/index.php");
die();
}
echo("Has hecho login erroneamente 3 veces seguidas, Debes esperar para poder iniciar sesion de nuevo<br><br>$minutos minutos y $sec segundos");
die();
} else {
$_SESSION['tryes'] = 0;
}
}
if (isset($_GET['login']) && isset($_POST['u']) && isset($_POST['p']) && !isset($_GET['u']) && !isset($_GET['p'])) {
$checking = array($_POST['u'], $_POST['p']);
$_POST['u'] = htmlspecialchars($_POST['u']);
$_POST['p'] = htmlspecialchars($_POST['p']);
if (strlen($_POST['u']) > 5) {
if (strlen($_POST['p']) > 5) {
if ($checking[0] === $_POST['u'] && $checking[1] === $_POST['p']) {
$_SESSION['tn6loggeado'] = array();
$_SESSION['tn6loggeado']['usuario'] = $_POST['u'];
$_SESSION['tn6loggeado']['password'] = $_POST['p'];
$_SESSION['tryes'] = 0;
Redirect("https://www.venad.cf/srv/host/index.php");
} else {
$_SESSION['lasterror'] = "Estas intentando meter un codigo script? nanai";
$_SESSION['tryes'] = $_SESSION['tryes'] + 1;
Redirect("https://www.venad.cf/srv/host/index.php");
}
} else {
$_SESSION['lasterror'] = "Tu contraseña debe contener 6 o mas caracteres";
$_SESSION['tryes'] = $_SESSION['tryes'] + 1;
Redirect("https://www.venad.cf/srv/host/index.php");
}
} else {
$_SESSION['lasterror'] = "Tu usuario debe contener 6 o mas caracteres";
$_SESSION['tryes'] = $_SESSION['tryes'] + 1;
Redirect("https://www.venad.cf/srv/host/index.php");
}
} elseif (isset($_GET['login']) && !isset($_POST['u']) && !isset($_POST['p'])) {
$_SESSION['lasterror'] = "Error al loggearte, comprueba que estas loggeandote de forma correcta";
$_SESSION['tryes'] = $_SESSION['tryes'] + 1;
Redirect("https://www.venad.cf/srv/host/index.php");
}
if (isset($_GET['logout']) && !isset($_GET['login']) && isset($_SESSION['tn6loggeado']['usuario']) && isset($_SESSION['tn6loggeado']['password'])) {
session_destroy();
session_unset();
Redirect("https://www.venad.cf/srv/host/index.php");
} elseif (isset($_GET['login']) or isset($_GET['logout'])) {
Redirect("https://www.venad.cf/srv/host/index.php");
}
if (!isset($_SESSION['tn6loggeado'])) {
echo("<form action=\"index.php?login\" method=\"POST\">
Usuario:<br>
<input type=\"text\" name=\"u\">
<br>
Contraseña:<br>
<input type=\"password\" name=\"p\">
<br><br>
<input type=\"submit\" value=\"Login\"><button disabled>Registrarse!</button>
</form>");
if (isset($_SESSION['tryes']) && $_SESSION['tryes'] > 0) {
$_SESSION['lasttime'] = time() + (60*5);
echo ("Error: {$_SESSION['lasterror']}<br>");
echo ("<br> Comprueba tus datos de acceso, intento numero {$_SESSION['tryes']} / 3");
}
}
elseif (isset($_SESSION['tn6loggeado'])) {
echo("Tu usuario es este: {$_SESSION['tn6loggeado']['usuario']} <br><br>");
echo("Tu contraseña es esta: {$_SESSION['tn6loggeado']['password']}<br><br>");
echo("<a href=\"./index.php?logout\"><button>Cerrar sesion</button></a><br><br>");
}
?>
</body>
</html>
De ese modo estas usando variables de sesión. Por tanto, para el intruso sería tan fácil como borrar las cookies, y ya tendría 10 intentos más. Mi método también tiene sus pegas, en la mayoría de las conexiones a internet se usan IP dinámicas por tanto con reiniciar el router también se dispondrían de 10 nuevos intentos. Pero reiniciar el router es mas pesado que borrar las cookies.
Yo ademas añadiría un captcha para evitar bots
https://www.google.com/recaptcha/intro/index.html