[Resuelto] como hago para restringir 10 minutos una pagina?

Iniciado por venadHD, 20 Julio 2015, 19:39 PM

0 Miembros y 1 Visitante están viendo este tema.

venadHD

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:

Código (php) [Seleccionar]
<?php
function Redirect($url$permanent false) {
header('Location: ' $urltrue$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>

Código (php) [Seleccionar]
<?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

joecarl

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.

venadHD

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?

Código (php) [Seleccionar]
<?php
function Redirect($url$permanent false) {
header('Location: ' $urltrue$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'] >= && 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>

joecarl

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.