Foros del Web » Programando para Internet » PHP »

Login Seguro PHP MYSQL Sesiones inseguras..

Estas en el tema de Login Seguro PHP MYSQL Sesiones inseguras.. en el foro de PHP en Foros del Web. Hola a todos, Bueno llevo unas horas mirando ejemplos sobre login seguros en internet, y la verdad es que todos los que he probado son ...
  #1 (permalink)  
Antiguo 09/10/2011, 03:02
 
Fecha de Ingreso: mayo-2004
Mensajes: 102
Antigüedad: 19 años, 11 meses
Puntos: 5
Pregunta Login Seguro PHP MYSQL Sesiones inseguras..

Hola a todos,
Bueno llevo unas horas mirando ejemplos sobre login seguros en internet, y la verdad es que todos los que he probado son bastante vulnerables, he creado este de la siguiente manera:

<?php
require_once('../Connections/localhost.php');

$username = mysql_real_escape_string($_POST['username']);
$password = hash('MD5', $_POST['password']);
$reset = hash('MD5', $_POST['reset']);

mysql_select_db($database_localhost, $localhost);
$query_log_in = "SELECT * FROM user_members WHERE username = '$username' AND password = '$password' AND reset = '$reset'";
$log_in = mysql_query($query_log_in, $localhost) or die(mysql_error());
$row_log_in = mysql_fetch_assoc($log_in);
$totalRows_log_in = mysql_num_rows($log_in);

if(isset($_POST['Login'])){

if($username == $row_log_in['username'] && $password== $row_log_in['password'] && $reset === $row_log_in['reset'])
{
// Login
session_start();
$_SESSION['username'] = htmlspecialchars($username); // htmlspecialchars() sanitises XSS
}
else
{
// Invalid username/password
echo '<p><strong>Error:</strong> Invalid username or password.</p>';
$para = '@gmail.com, @gmail.com';
$cuerpo = 'Ha habido un intento de entrar en tu cuenta de Administrador en Md4s,<br />Ip='.$_POST['ip'].'<br />
Pusieron este nombre de usuario='.$_POST['username'];
$sujeto = 'Intento de hack!';
$headers = 'From: [email protected]';
mail($para,$sujeto,$cuerpo,$headers);
}
}
// Redirect
//header('Location: http://www.example.com/loggedin.php');
if($_SESSION['username']){
if(isset($_GET["action"])){
if($_GET["action"]){

session_unset();
//unset are session variables

session_destroy();
// destroy session
}
}








echo "ahora estas logeado";
echo '<a href=add_bookings.php?'.$_SESSION['username'].'>Agregar booking</a>';
echo "<a href='login.php?action=logout'>Log out</a>";}else{







?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Admin :: Log-in</title>
<link href="style_root.css" rel="stylesheet" type="text/css" />
</head>

<body>
<div class="admin" style="width:450px; text-align:center; margin:auto; margin-top:100px;">
<img src="img/logo_intern.png" width="106" height="94" alt="Logo MD4S" />

<form action="login.php" method="post" name="Login">
<table width="200" border="0" align="center" cellpadding="10" cellspacing="5">
<tr>
<td align="right">Username: </td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td align="right">Password: </td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td align="right">Reset:</td>
<td><input type="password" name="reset" /></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" name="Login" id="Login" value="Login" />
<input type="hidden" name="ip" value="<?php
function getIP() {
if (isset($_SERVER)) {
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
return $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
return $_SERVER['REMOTE_ADDR'];
}
} else {
if (isset($GLOBALS['HTTP_SERVER_VARS']['HTTP_X_FORWARDER_FOR'])) {
return $GLOBALS['HTTP_SERVER_VARS']['HTTP_X_FORWARDED_FOR'];
} else {
return $GLOBALS['HTTP_SERVER_VARS']['REMOTE_ADDR'];
}
}
}
?>
<?php echo getIP(); ?>" /></td>
</tr>
</table>
</form>
<?PHP
}
exit;

?> </div>
</body>
</html>


Bueno este codigo practicamente hace lo siguiente:

-Si no hay ningun dato por post muestra el formulario.
-Si alguien pone los datos incorrecto no logra logearse y da invalid password ademas envia un email a mi
-Si alguien se loguea muestra el ahora este logeado y el boton de log out.

Hasta aqui creo que todo muy bien, ahora voy a otra pagina que tendria que restringir acceso a los NO logeados y pongo el siguiente codigo:

Código PHP:
<?php 


session_start
(); 

if (isset(
$_SESSION)){

//muestra eso si estas logeado
}else{

// muestra esto si eres un intruso.
}

 
?>
pero si en la url pongo la-pagina-restringida.php?cualquier-cosa

Me da un True al log in y puedo ver la pagina.

Si encambio lo hago de esta manera:
Código PHP:
<?php 


session_start
(); 

if (isset(
$_SESSION)){
if (
$_SESSION==$username){

//muestra eso si estas logeado
}else{

// muestra esto si eres un intruso.
}
}
 
?>

Sucede lo mismo, entonces mi pregunta es, tengo que borrar el codigo y empezar de nuevo?jeje.

Son tan inseguras las session en php? O estoy haciendo mal algo?

En ese caso que deberia cambiar?

Desde ya muchas gracias al que se tome el tiempo en responder!

Un saludo!
__________________
Bruno Quintana
  #2 (permalink)  
Antiguo 09/10/2011, 03:41
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 15 años, 9 meses
Puntos: 165
Respuesta: Login Seguro PHP MYSQL Sesiones inseguras..

No me lo he mirado todo pero..

haces un isset de $_SESSION completo... no sería $_SESSION['nombre-de-la-session']??

También he visto muchas recomendaciones de hacer session_start de esta manera:

Código PHP:
Ver original
  1. <?php session_start(); ?>
  2. <?php
  3.  
  4. //el resto...

Un saludo!
__________________
Gracias por el Karma :D

empleo ofertas de trabajo
  #3 (permalink)  
Antiguo 09/10/2011, 03:42
 
Fecha de Ingreso: julio-2005
Mensajes: 310
Antigüedad: 18 años, 9 meses
Puntos: 36
Respuesta: Login Seguro PHP MYSQL Sesiones inseguras..

Hola

Es que cuando haces if (isset($_SESSION)) estás diciendo que si existe la variable $_SESSION entonces entra. Y siempre entrará, porque nada más hacer el session_start() que le predece queda definida esa variable.

Y la segunda opción tampoco puede funcionar, porque $_SESSION es un array asociativo, no puedes comparar un string con un array, deberías haber hecho:

$_SESSION['username'] = $username;

Saludos.
  #4 (permalink)  
Antiguo 21/10/2011, 15:56
 
Fecha de Ingreso: abril-2011
Mensajes: 25
Antigüedad: 13 años
Puntos: 2
Respuesta: Login Seguro PHP MYSQL Sesiones inseguras..

como ya te mencionaron haces una validacion de la matriz $_SESSION debes especificar que variable y que valor debe tener y asi si no cumple esta condicion eliminas la sesion ya que la iniciaste en el session_start() y vuelves al login.

ahora otros consejo de seguridad es que debes hacer justo después de tu session_start() un session_regenerate_id(true) con esto regeneras la id y evitas un posible secuestro de sesion con xss (cross-site scripting)

mas consejos de seguridad en

*************

Última edición por jpinedo; 23/10/2011 a las 12:25 Razón: remover firma y autopromo

Etiquetas: seguridad, session
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:39.