Foros del Web » Programando para Internet » PHP »

Se puede agregar algo mas en cuestion de seguridad?

Estas en el tema de Se puede agregar algo mas en cuestion de seguridad? en el foro de PHP en Foros del Web. Hola estoy tratando de hacer un login seguro usando base de dato. Quería saber si me está faltando algo para que sea segura (injection) La ...
  #1 (permalink)  
Antiguo 01/04/2009, 10:54
 
Fecha de Ingreso: diciembre-2005
Ubicación: Barcelona
Mensajes: 1.428
Antigüedad: 18 años, 4 meses
Puntos: 15
Se puede agregar algo mas en cuestion de seguridad?

Hola
estoy tratando de hacer un login seguro usando base de dato.

Quería saber si me está faltando algo para que sea segura (injection)

La parte de consulta a la db la hago asi:

Código:
	$username = stripslashes($_POST['username']);
    $password = stripslashes($_POST['password']);
    
	$username = mysql_real_escape_string($username);
    $password = md5(mysql_real_escape_string($password));
    
	$checklogin = mysql_query("SELECT * FROM users WHERE Username = '".$username."' AND Password = '".$password."' LIMIT 1");
    
    if(mysql_num_rows($checklogin) == 1)
    {
    	 $row = mysql_fetch_array($checklogin);
        $email = $row['EmailAddress'];
        
        $_SESSION['Username'] = $username;
        $_SESSION['EmailAddress'] = $email;
        $_SESSION['LoggedIn'] = 1;
        
    	 header("location:areaPrivada.php");

    }
gracias
  #2 (permalink)  
Antiguo 01/04/2009, 11:00
Avatar de the_web_saint  
Fecha de Ingreso: mayo-2008
Ubicación: localhost/tierra/america/panama
Mensajes: 1.229
Antigüedad: 16 años
Puntos: 43
Respuesta: Se puede agregar algo mas en cuestion de seguridad?

Quizás si usaras un metodo de encriptación para el password en la DB. Como md5 o sha1.
Para mi es mejor sha1 :P
__________________
..::The Saint::..
El pesimista se queja del viento; el optimista espera que cambie; el realista ajusta las velas.
  #3 (permalink)  
Antiguo 01/04/2009, 11:05
Avatar de farra  
Fecha de Ingreso: marzo-2008
Ubicación: Aqui estoy
Mensajes: 574
Antigüedad: 16 años, 1 mes
Puntos: 20
Respuesta: Se puede agregar algo mas en cuestion de seguridad?

es opcionar pero podrias validar el tipo de dato y la longitud...
Código PHP:
if (!function_exists("seguridad")) {
function 
seguridad($theValue$theType$theDefinedValue ""$theNotDefinedValue ""$tamanomax
{

  
// longitud del texto
  
$theValue=substr($theValue0$tamanomax);

  
// contra inyeccion sql
  
$theValue get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
  
$theValue function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

 
// tipo de dato
  
switch ($theType) {
    case 
"text":
      
$theValue = ($theValue != "") ? "'" $theValue "'" "NULL";
      break;
    case 
"text2":
      
$theValue = ($theValue != "") ? "" $theValue "" "";
      break;    
    case 
"long":
    case 
"int":
      
$theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case 
"intonulo":
      
$theValue = ($theValue != "") ? intval($theValue) : "";
      break;
    case 
"double":
      
$theValue = ($theValue != "") ? "'" doubleval($theValue) . "'" "NULL";
      break;
    case 
"date":
      
$theValue = ($theValue != "") ? "'" $theValue "'" "NULL";
      break;
    case 
"defined":
      
$theValue = ($theValue != "") ? $theDefinedValue $theNotDefinedValue;
      break;
    case 
"like":
      
$theValue = ($theValue != "") ? "'%" $theValue "%'" "NULL";
      break;
    case 
"likedespues":
      
$theValue = ($theValue != "") ? "'" $theValue "%'" "NULL";
      break;
    case 
"likeantes":
      
$theValue = ($theValue != "") ? "'%" $theValue "'" "NULL";
      break;
  }

  return 
$theValue;
}

Como usar:
Código PHP:
<?php
// variable, tipo de dato, longitud maxima
$dato=seguridad($_POST['variable'],"int",10);
?>
__________________
Firma:
Es mas dificil para el mono entender que el hombre desciende de el....

PD: Siempre doy karma al que me da una buena respuesta... ;0)

Última edición por farra; 02/04/2009 a las 07:43
  #4 (permalink)  
Antiguo 02/04/2009, 03:56
 
Fecha de Ingreso: diciembre-2005
Ubicación: Barcelona
Mensajes: 1.428
Antigüedad: 18 años, 4 meses
Puntos: 15
Respuesta: Se puede agregar algo mas en cuestion de seguridad?

Cita:
Iniciado por the_web_saint Ver Mensaje
Quizás si usaras un metodo de encriptación para el password en la DB. Como md5 o sha1.
Para mi es mejor sha1 :P
buena idea. quedaría así:

Código:
	$username = stripslashes($_POST['username']);
    $password = stripslashes($_POST['password']);
    
	$username = mysql_real_escape_string($username);
    $password = sha1(mysql_real_escape_string($password));
    
	$checklogin = mysql_query("SELECT * FROM users WHERE Username = '".$username."' AND Password = '".$password."' LIMIT 1");
    
    if(mysql_num_rows($checklogin) == 1)
    {
    	 $row = mysql_fetch_array($checklogin);
        $email = $row['EmailAddress'];
        
        $_SESSION['Username'] = $username;
        $_SESSION['EmailAddress'] = $email;
        $_SESSION['LoggedIn'] = 1;
        
    	 header("location:areaPrivada.php");

    }
La verdad es que me gustaría dejar el codigo que he encontrado del sistema: Registro + Login + Logout (que son 4 archivos) para que le mejoremos todas las cuestiones de seguridad.
No se, igual cuando esté bien lo podemos dejar como aporte no?
  #5 (permalink)  
Antiguo 02/04/2009, 07:41
Avatar de the_web_saint  
Fecha de Ingreso: mayo-2008
Ubicación: localhost/tierra/america/panama
Mensajes: 1.229
Antigüedad: 16 años
Puntos: 43
Respuesta: Se puede agregar algo mas en cuestion de seguridad?

Buena idea, esto ayudaría mucho a muchas personas.

Saludos
__________________
..::The Saint::..
El pesimista se queja del viento; el optimista espera que cambie; el realista ajusta las velas.
  #6 (permalink)  
Antiguo 03/04/2009, 01:51
 
Fecha de Ingreso: diciembre-2005
Ubicación: Barcelona
Mensajes: 1.428
Antigüedad: 18 años, 4 meses
Puntos: 15
Respuesta: Se puede agregar algo mas en cuestion de seguridad?

Ok.

Recuerden que es muy pobre en cuanto a seguridad y la idea es mejorarla.
Lo digo para que no se tome como un código que puede usarse como está ahora


El sistema tiene 5 archivos y vamos a necesitar crear una base de datos (sql) con una tabla:

1- Base de Datos: aquí se guardan los datos de los usuarios registrados.
2- index.php (página donde se ingresa usuario y contraseña para el ingreso)
3- regisiter.php (página donde el usuario se registra con nombre de usuario y contraseña)
4- logout.php (necesario para finalizar una sesión de forma segura)
5- secured/mysql.php (donde se guardan los datos de conección a la base de datos. Este archivo está dentro de la carpeta 'secure')
6- secured/.htaccess (para proteger el contenido de la carpeta 'secured')

nota: 'index.php', 'register.php', 'logout.php' y la carpeta 'secured' están en el mismo nivel. Luego la carpeta 'secured' contiene: 'mysql.php' y '.htaccess'.


1- Base datos (codigo para crearla)

Creamos la base de datos con nombre 'membership'. Luego creamos la tabla 'users' con el siguiente código:
Código:
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

CREATE TABLE `users` (
  `UserID` int(25) NOT NULL auto_increment,
  `Username` varchar(65) NOT NULL,
  `Password` varchar(32) NOT NULL,
  `EmailAddress` varchar(255) NOT NULL,
  PRIMARY KEY  (`UserID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
2 index.php
Código:
<?php include "secured/mysql.php"; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
<title>User Management System (Tom Cameron for NetTuts)</title>
<link rel="stylesheet" href="style.css" type="text/css" />
</head>  
<body>  
<div id="main">
<?php
if(!empty($_SESSION['LoggedIn']) && !empty($_SESSION['Username']))
{
	 ?>
    
    <h1>Area Privada</h1>
  	 <p>Hola! <?=$_SESSION['Username']?>. Your email address is <b><?=$_SESSION['EmailAddress']?>.</p>
    
    <ul>
        <li><a href="logout.php">Cerrar Area Privada</a></li>
    </ul>
    
    <?php
}
elseif(!empty($_POST['username']) && !empty($_POST['password']))
{


	$username = stripslashes($_POST['username']);
    $password = stripslashes($_POST['password']);
    
	$username = mysql_real_escape_string($username);
    $password = md5(mysql_real_escape_string($password));
    
	$checklogin = mysql_query("SELECT * FROM users WHERE Username = '".$username."' AND Password = '".$password."' LIMIT 1");
    
    if(mysql_num_rows($checklogin) == 1)
    {
    	 $row = mysql_fetch_array($checklogin);
        $email = $row['EmailAddress'];
        
        $_SESSION['Username'] = $username;
        $_SESSION['EmailAddress'] = $email;
        $_SESSION['LoggedIn'] = 1;
        
    	 echo "<h1>Success</h1>";
        echo "<p>Lo estamo redirigiendo a un Area Privada.</p>";
        echo "<meta http-equiv='refresh' content='=2;index.php' />";
    }
    else
    {
    	 echo "<h1>Error</h1>";
        echo "<p>Lo sentimos, su cuenta no ha sido encontrada. <a href=\"index.php\">clic aqu&iacute; para intentarlo de nuevo</a>.</p>";
    }
}
else
{
	if($_POST['sent']){if(empty($_POST['username']) || empty($_POST['password'])){$mensaje="Debe ingresar su nombre de usuario y contrase&ntilde;a";}}else{$mensaje="Ingrese su nombre de usuario y contrase&ntilde;a";}

	?>
    
   <h1>Acceso Privado</h1>
    
   <p><?php echo $mensaje; ?> o <a href="register.php">reg&iacute;strese</a>.</p>
    
	<form method="post" action="index.php" name="loginform" id="loginform">
	<fieldset>
		<label for="username">Usuario:</label><input type="text" name="username" id="username" /><br />
		<label for="password">Contrase&ntilde;a:</label><input type="password" name="password" id="password" /><br />
		<input type="hidden" name="sent" value="sent" />
		<input type="submit" name="login" id="login" value="Ingresar" />
	</fieldset>
	</form>
    
   <?php
}
?>
</div>
</body>
</html>
3- register.php
Código:
<?php include "secured/mysql.php"; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">  
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
<title>User Management System (Tom Cameron for NetTuts)</title>
<link rel="stylesheet" href="style.css" type="text/css" />
</head>  
<body>  
<div id="main">
<?php
if(!empty($_POST['username']) && !empty($_POST['password']))
{
	$username = mysql_real_escape_string($_POST['username']);
    $password = md5(mysql_real_escape_string($_POST['password']));
    $email = mysql_real_escape_string($_POST['email']);
    
	 $checkusername = mysql_query("SELECT * FROM users WHERE Username = '".$username."'");
     
     if(mysql_num_rows($checkusername) == 1)
     {
     	echo "<h1>Error</h1>";
        echo "<p>Sorry, that username is taken. Please go back and try again.</p>";
     }
     else
     {
     	$registerquery = mysql_query("INSERT INTO users (Username, Password, EmailAddress) VALUES('".$username."', '".$password."', '".$email."')");
        if($registerquery)
        {
        	echo "<h1>Success</h1>";
        	echo "<p>Your account was successfully created. Please <a href=\"index.php\">click here to login</a>.</p>";
        }
        else
        {
     		echo "<h1>Error</h1>";
        	echo "<p>Sorry, your registration failed. Please go back and try again.</p>";    
        }    	
     }
}
else
{
	?>
    
   <h1>Register</h1>
    
   <p>Registro</p>
    
	<form method="post" action="register.php" name="registerform" id="registerform">
	<fieldset>
		<label for="username">Usuario:</label><input type="text" name="username" id="username" /><br />
		<label for="password">Contraseña:</label><input type="password" name="password" id="password" /><br />
        <label for="email">Email:</label><input type="text" name="email" id="email" /><br />
		<input type="submit" name="register" id="register" value="Register" />
	</fieldset>
	</form>
    
   <?php
}
?>
</div>
</body>
</html>
4- logout.php
Código:
<?php include "secured/mysql.php"; 
$_SESSION = array(); 
session_destroy(); 
?>
<meta http-equiv="refresh" content="0;index.php">
5- mysql.php
Código:
<?php
session_start();

$dbhost = "localhost"; // comprueba si es tu caso
$dbname = "membership"; // el nombre de la base de datos
$dbuser = "########"; // el username para acceder a tu base de datos
$dbpass = "**********"; // la contraseña para acceder a tu base de datos

mysql_connect($dbhost, $dbuser, $dbpass) or die("MySQL Error: " . mysql_error());
mysql_select_db($dbname) or die("MySQL Error: " . mysql_error());
?>
6- .htaccess
Código:
deny from all
Saludos

Última edición por chefnelone; 03/04/2009 a las 03:31
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

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 06:56.