Hola, estoy haciendo un codigo de seguridad para un sistema que estoy armando así que me gustaría que me ayuden a mejorarlo por eso lo subí a mi hosting y así lo pueden probar les pido por favor que me digan si encuentran un fallo o alguna manera de mejorar el código, ya que seria de gran ayuda para mi y me serviría para mejorar mis conocimiento en php que recién estoy empezando :) , desde ya gracias.
http://maximilianogarro.com.ar/ (http://maximilianogarro.com.ar/)
El código en cuestión:
fns_login.php
//Reporte de error
function error($error){
setcookie("reporte",$error,time()+180,"/","");
header("Location: ../index.php");
exit;
}
//Conectamos a la base de datos
function db_login(){
//Conectamos a la db
$host = '------';
$userdb = '------';
$passdb = '------';
$db = '------';
$connect = @mysql_connect($host,$userdb,$passdb);
if($connect === false){
return false;
error("Error: No se a podido conectar a la base de datos.");
}else{
//Si se conecto seleccionamos la db
$selectdb = @mysql_select_db($db,$connect);
if($selectdb === false){
return false;
die('Error: No se a podido conectar con la base de datos.');
}else{ return true; }
}
}
//cifrar con contraseña
function cifrar($pass){
$passsafe = hash_hmac('sha1', $pass, '_?¿·¨^*ç"$"1@ª!"·¿?·¡523ç´MaXi´Ç¨ç{}');
return $passsafe;
}
//Verifica si esta logeado.
function firewall(){
//verificamos que existan las cookies
if ( isset($_COOKIE['sistema']) && isset($_COOKIE['sistema2']))
{
//Inicializamos VariablesS
$key = $_COOKIE['sistema'];
$userid = $_COOKIE['sistema2'];
//Conectamos ala db
$connect = db_login();
//Si la selecciono procedemos con la consulta
if ($connect === true){
$loginquery = sprintf("SELECT * FROM `usuarios_sess`,`usuarios_log` WHERE `usuarios_sess`.`fkusuario`= '%s' AND `usuarios_log`.`pkusuario_log` = `usuarios_sess`.`fkusuario_log`;", mysql_real_escape_string($userid));
$login = @mysql_query($loginquery);
if (($login === false) || (mysql_num_rows($login) != 1)){
error("Error: Intente nuevamente.");
}else{
$usuariodb = mysql_fetch_array($login);
$keydb = $usuariodb['KEY'];
$ip = $usuariodb['ip'];
//Comparamos Key e IP para evitar que nos roben la cookie :D
if ($keydb != $key || $ip != $_SERVER['REMOTE_ADDR']) {
error("Error: Debe logear para ver esta pagina.");
}
}
mysql_close();
}
}else{
header("Location: index.php");
}
}
login.php
//Iniciamos Session
session_start();
//Incluimos funciones
include_once('fns_login.php');
//Validamos que las variables del captcha existan
if (!isset($_POST['key']) || !isset($_SESSION['CAPTCHA'])){
error("Error: Intenta acceder a este sitio de una forma incorrecta.");
}else{
//Validamos que las varibles encriptadas sean iguales
if(md5($_POST['key']) != $_SESSION['CAPTCHA']){
error("Error: Nos has introducido el codigo correcto.");
}else{
//Destruismos variables captcha
unset($_SESSION['CAPTCHA']);
unset($_POST['key']);
session_destroy;
//validamos variables
$user = $_POST['user'];
$pass = $_POST['pass'];
//ciframos password con sha1 y contraseña
$passsafe = cifrar($pass);
if (!isset($user) && (ereg("^[a-zA-Z0-9]$", $user)=== false) && (strlen($user)> 50)){
error("Error: Nombre de usuario invalido.");
}else{
if (!isset($pass) && (ereg("^[a-zA-Z0-9]$", $pass)=== false) && (strlen($pass)> 20)){
error("Error: Contraseña con caracteres invalidos.");
}else{
//Conectamos ala db
$connect = db_login();
//Si la selecciono procedemos con la consulta
if ($connect === false){
error("Error: No se pudo conectar con la base de datos.");
}else{
//Si la selecciono procedemos con la consulta
$loginquery = sprintf("SELECT `pkusuario` FROM `usuarios` WHERE `usuario`='%s' AND `password`='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($passsafe)
);
$login = @mysql_query($loginquery);
if (($login === false) || (mysql_num_rows($login) != 1)){
error("Error: El usuario no existe.");
}else{
// Ya logio => obtenemos datos
$usuariodb = mysql_fetch_array($login);
$userid = $usuariodb['pkusuario'];
$fecha = gmdate('Y-n-j H:i:s');
$ip = $_SERVER['REMOTE_ADDR'];
$localhost = gethostbyaddr($ip);
$navegador = $_SERVER['HTTP_USER_AGENT'];
//ciframos un key unico de usuario
$key = cifrar($ip.$fecha);
//almacenamos logs por seguridad y consulta futura
$logs = "INSERT INTO `usuarios_log` (`pkusuario_log` ,`fkusuario` ,`ip` ,`localhost` ,`navegador` ,`login` ,`logout`)
VALUES ('null', '".$userid."', '".$ip."', '".$localhost."', '".$navegador."', '".$fecha."', '".$fecha."');";
$almacenalogs = @mysql_query($logs);
$idlogs = mysql_insert_id();
//borramos si existia session
@mysql_query("DELETE FROM `usuarios_sess` WHERE `fkusuario` = '".$userid."'");
//entonces alamacenamos los nuevos keys
$keylogs = "INSERT INTO `usuarios_sess`(`KEY` ,`fkusuario` ,`fkusuario_log`)
VALUES ('".$key."', '".$userid."', '".$idlogs."');";
$almacenakeylogs = @mysql_query($keylogs);
if (($almacenalogs === false) && ($almacenakeylogs === false)){
error("Error: No se puede iniciar existe un error al conectar.");
}else{
setcookie("sistema", $key, time()+3600,"/","");
setcookie("sistema2", $userid, time()+3600,"/","");
header("Location: ../web_segura.php");
mysql_close();
die;
}
}
}
}
}
}
}
logout.php
include_once('fns_login.php');
if ( isset($_COOKIE['sistema']) && isset($_COOKIE['sistema2'])){
$key = $_COOKIE['sistema'];
$userid = $_COOKIE['sistema2'];
setcookie("sistema", $key, time()-3600,"/","");
setcookie("sistema2", $userid, time()-3600,"/","");
$fecha = gmdate('Y-n-j H:i:s');
$connect = db_login();
//Si se conecto a la db
if ($connect === true){
$logoutquery = sprintf("UPDATE `usuarios_log` SET `logout` = '".$fecha."' WHERE `pkusuario_log` = (SELECT `fkusuario_log`
FROM `usuarios_sess` WHERE `fkusuario` = '%s' );" , mysql_real_escape_string($userid));
$logout = @mysql_query($logoutquery);
$keysess = sprintf("DELETE FROM `usuarios_sess` WHERE `fkusuario` = '%s';", mysql_real_escape_string($userid));
$keyout = @mysql_query($keysess);
mysql_close();
}
if (!isset($_COOKIE['sistema']) || $keyout === true){
setcookie("reporte","Deslogeado Correctamente.",time()+180,"/","");
}
header("Location: ../index.php");
}else{
header("Location: ../index.php");
}
Link de descarga del codigo:
http://www.4shared.com/file/_eUj3D8u/userlogin_by_beringer.html (http://www.4shared.com/file/_eUj3D8u/userlogin_by_beringer.html)