Hola, estoy intentando desarrollar un sistema de login en php, al parecer todo funciona bien, pero lo que no me funciona es el sistema anti session hijacking.
Quisiera saber si alguien me puede ayudar a encontrar el problema.
Para probar el csrf, una vez logueado con tamper data trato de enviar logout pero eliminando el t= Entonces dice csrf attempt.
Pero para probar session hijacking, no me funciona el tema del $fingerprint, una vez logueado, abro otra pestaña con firefox, y accedo a la url viendo el contenido exlusivo, si abro otra pestaña y accedo a la url, pero modificando el user agent, no se cae, diciendo session hijacking attempt, como que no cambia la cadena $fingerprint, y ese es el problema que tengo.
Si alguien por favor también pudiera darme sugerencias para hacer un buen sistema de login, se lo agradecería también.
//editado porque no estaba bueno. Abajo encuentran un código más decente.
Bueno, me respondo solo.
La solución fue comenzar a escribir todo de nuevo, pero basándome en funciones para así revisar y encontrar los errores.
Al final, no sé cual era el error, pero cree un código nuevo y funciona.
Este es el código, puede servirle a alguien.
/inc/auth.php
<?php
die('Hacking attempt...');
function sesionPorDefecto()
{
cerrarSesion();
$_SESSION['logeado'] = false;
$_SESSION['anticsrf'] = 0;
$_SESSION['token'] = 0;
}
function cerrarSesion()
{
}
function estaLogeado()
{
if (isset($_SESSION['logeado']) && $_SESSION['logeado'] === true) {
return true;
}
return false;
}
function intentoCsrf()
{
if (!isset($_SESSION['anticsrf']) || $_SESSION['anticsrf'] !== $_POST['t']
)
{
return true;
}
return false;
}
function intentoSessionHijacking($fingerprint)
{
if (estaLogeado()
&& $_SESSION['token'] !== $fingerprint)
{
return true;
}
return false;
}
?>
/inc/filtros.php
es el code que se encuentra en:
http://foro.elhacker.net/php/filtro_sql_injection_y_filtro_xss-t270635.0.html
el foro no me deja postearlo.
/logout.php
<?php
require_once(dirname(__FILE__).'/inc/auth.php'); require_once(dirname(__FILE__).'/inc/filtros.php');
if (estaLogeado()
&& !intentoCsrf())
{
cerrarSesion();
echo 'Session closed.';
echo '<br/>';
echo '<a href="login.php">Go Login</a>';
} else {
die ('Csrf attempt ...'); }
?>
/login.php
<?php
require_once(dirname(__FILE__).'/inc/auth.php'); require_once(dirname(__FILE__).'/inc/filtros.php');
$fingerprint = $fingerprint = md5('12345'.$_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'].'6789');
if (intentoSessionHijacking($fingerprint))
{
cerrarSesion();
die('Session hijacking attempt ...'); }
if (!estaLogeado())
{
if ($_POST['username'] && $_POST['password'])
{
$username = antiSQLInjection($_POST['username']);
$password = antiSQLInjection($_POST['password']);
//Hacer consulta en bd.
if ($username == 'carlos' && $password == 'entrar')
{
$_SESSION['logeado'] = true;
$_SESSION['anticsrf'] = sha1('dfGFGsfsdf46433794bvcv' . uniqid(rand(), TRUE) . 'addsfFHf5efSAfr324'); $_SESSION['token'] = $fingerprint;
}
}
}
if (!estaLogeado())
{
?>
<form method='POST' action='login.php'>
<span>Username:</span>
<input name="username" type="text" maxlength="20" size="20" />
<span>Password:</span>
<input name="password" type="text" maxlength="15" size="20" />
<input name="login" type="submit" value="Login" />
</form>
<?php
} else
{
echo 'You are logged' . '<br/>';
echo '<a href="index.php">Go Home</a>';
echo ("
<form method='POST' action='logout.php'>
<input name=\"t\" type=\"hidden\" value=\"" . $_SESSION['anticsrf'] ."\" />
<input name=\"logout\" type=\"submit\" value=\"Logout\" />
</form>
");
}
?>