Sugerencias para un auth en php

Kr4n3oK

Hola, estoy intentando crear mis propias funciones y sistemas de seguridad para evitar accesos malintencionados con consultas sql en un sistema de autenticación por php.
Os dejo aquí el código para que me digáis las fallas que a simple vista le veis y en que podría mejorar.

logon.php el que recibe directamente del form, comprueba las variables que se van a usar y después si están vacías o no para enviarlo al que tratará los datos.

<?php

include("system/dbhandler.class.php");

if(isset($_POST['user']) || isset($_POST['passu'])){
	//Las variables están definidas y son las correctas.
		if(empty($_POST['user']) || empty($_POST['passu'])){
		
		header("Location: ../index.php?dataLogEmpty");
		
	}else{
		$user = $_POST['user'];
		$pass = $_POST['passu'];
		
		$dbh = new dbhandler;
		$dbh->logOn($user,$pass);
		
	}
	
}else{
	header("Location: ../index.php?noAllowConecction");
}


?>

Función que se encargará de tratar los datos recibidos y comprobar que no son malintencionados, aún por terminar.
Es una clase.

function logOn($user,$pass){
	//session_start();
	
$user = mysql_real_escape_string($user);
$pass = md5($pass);

$usercheck = mysql_query("select * from usuario where usuario = '$user' && contraseña = '$pass'");
if (mysql_num_rows($usercheck)) {


	$iduser = mysql_query("select id from usuario where usuario = '$user'");
	while ($id = mysql_fetch_array($iduser)) {
		//Autentificado, definimos variables de session necesarias.
		$_SESSION['auth'] = "YES";
		$_SESSION['user'] = $user;
		$_SESSION['id'] = $id['id'];
		header("Location: zonanegocio/index.php");
	}
	
} else {
//No autentificado
header("Location: ../index.php?userNotFound");
}

}

En realidad lo que estoy intentando crear son capas, que cada una haga algo específico y ale.

Un cordial saludo y gracias.

Merkury

Aquí te dejo uno de los logins que tengo hechos de cuando estudiaba, es un poco rudimentario pero cumple su función, eso si alguien con un rato y conocimientos suficientes, se lo come con patatas, seguro.

<?php
include("functions/functions.php");

   $usuario = $_POST["usuario"];
   $password = $_POST["passwordFld"];

$us = strlen($_POST["usuario"]);
$pa = strlen($_POST["passwordFld"]);
	
if($us == "0" || $pa == "0")
{
	
	echo "<link href=css/Style.css rel=stylesheet type=text/css>
	<form action=index.php method=post>
        	<div id=showMsg>
	        <p>El usuario o el password no pueden estar vacios</p>
	        <input id=butLog type=submit value=Volver>
	        </div></form>"; 
					

}else if(isset($_POST["usuario"]))
	{
		
		if(isset($_POST["passwordFld"]))
		{

			$usuario = $_POST["usuario"];
			$password = $_POST["passwordFld"];
			$passmd5 = md5($password);

			connect("1");
			
			$result = mysql_query('SELECT id, user, password, privilegios FROM users WHERE user=\''.$usuario.'\'');
			if($row=mysql_fetch_array($result))
			{
				if($row['password'] == $passmd5 && $row['privilegios'] == 0)
				{
					setcookie(ID,$_POST['usuario'],time()+"2592000");
					if(isset($_COOKIE['CHECK']))
					{
						setcookie(CHECK,$_POST['nombre'],time()-"10000");
					}
					header("Location: index.php");
					connect("0");
					}else if($row['password'] == $passmd5 && $row['privilegios'] == '1')
					{
						setcookie(ID,$_POST['usuario'],time()+"2592000");
						setcookie(ADMIN,"1",time()+"2592000");
						if(isset($_COOKIE['CHECK']))
						{
							setcookie(CHECK,$_POST['nombre'],time()-"10000");
						}								
						header("Location: index.php");
						connect("0");
					}else if($row['password'] == $passmd5 && $row['privilegios'] == '2')
					{
						setcookie(ID,$_POST['usuario'],time()+"2592000");
						setcookie(TECH,"2",time()+"2592000");
						if(isset($_COOKIE['CHECK']))
						{
							setcookie(CHECK,$_POST['nombre'],time()-"10000");
						}
						header("Location: index.php");
						connect("0");
					
					}
					else
					{
					connect("0");
					echo "<link href=css/Style.css rel=stylesheet type=text/css>
					<form action=index.php method=post>
					<div id=showMsg>
					<p>Password incorrecto</p>
					<input id=butLog type=submit value=Volver>
					</div></form>";
					}

			}else 
			{
			        connect("0");
				echo "<link href=css/Style.css rel=stylesheet type=text/css>
				<form action=index.php method=post>
				<div id=showMsg>
				<p>Usuario no encontrado</p>
				<input id=butLog type=submit value=Volver>
				</div></form>";
					
			}
							
		}
}
?>

#3 Y la satisfacción de hacerlo tu mismo eh eh? :p

B

Para conexiones a bd usa el patron singleton y functiones static.
Las redirecciones con url amigables pues a nadie le importa lo que envias via GET
Usa un wrapper para gestionar las conexiones a bd, de esa forma si tu cliente quiere por ejemplo una bd en oracle no tienes que cambiar código.

Aprende a usar un framework(ZEND,CodeIgniter,etc) que ya trae clases para casi todo incluido roles de autentificación.

2 respuestas
Soltrac

#3 No se como funciona PHP con esto, pero si realizas una conexión estática, abres una transacción y ejecutas a la vez otra transacción en esa conexión no te va a dar problemas?

#5 Ah vale vale

1 respuesta
B

#4 Te refieres a 2 queries sql usando la misma conexión? no, ya se encarga el servidor de base de datos de gestionar la cola.

1 respuesta

Usuarios habituales