Tengo este sistema de usuarios
USUARIOS.PHP Código PHP:
<?php
if(!$SYS) exit; // Evita la visualización directa
class user{
function registrar($data_array){
/* Verifica que cada dato sea real */
/* Falta el nick */
if(!$data_array['nick'])
return array(
'estado' => 'error',
'data' => 'Falta el nick.'
);
/* Falta el pass */
if(!$data_array['pass'])
return array(
'estado' => 'error',
'data' => 'Falta la contraseña.'
);
/* El mail es falso */
if(!user::es_mail($data_array['mail']))
return array(
'estado' => 'error',
'data' => 'La dirección de correo no es válido.'
);
/* El usuario ya existe */
if(user::existe_dato($data_array['nick'], 'nick'))
return array(
'estado' => 'error',
'data' => 'El nick ya existe.'
);
/* El mail ya existe */
if(user::existe_dato($data_array['mail'], 'mail'))
return array(
'estado' => 'error',
'data' => 'La dirección E-Mail \''.$data_array['mail'].'\' ya está siendo utilizada.'
);
/* Los datos son correctos */
global $SYS; // Globaliza para el Handle de MySQL
/*
Hacemos la query y le decimos a la función que nos entregue el
la primera columna solamente
*/
$id = mysql::selecciona('
select max(id) from usuarios
', $SYS['MYSQL']['HANDLE'], true);
/* Si no hay usuarios entonces el id es 1 */
$id = ((int)$id['max(id)'] + 1);
if(mysql_query('
INSERT INTO `usuarios`.`usuarios` (
`id` ,
`nick` ,
`nombre` ,
`pass` ,
`mail` ,
`token` ,
`data` ,
`fecha_acceso`
) VALUES (
\''.(int)$id.'\',
\''.mysql_real_escape_string($data_array['nick']).'\',
\''.mysql_real_escape_string($data_array['nombre']).'\',
\''.mysql_real_escape_string(sha1($data_array['pass'])).'\',
\''.mysql_real_escape_string($data_array['mail']).'\',
\''.md5(microtime().rand(0,999)).'\',
\'\',
\''.time().'\'
);
', $SYS['MYSQL']['HANDLE']))
return array(
'estado' => 'ok',
'data' => 'La cuenta ha sido creada satisfactoriamente!'
); // Base de datos actualizada
else
return array(
'estado' => 'error',
'data' => 'Imposible crear tu cuenta. Contactate con el administrador.'
); // Imposible actualizar los datos
}
function existe_dato($dato, $tipo){
global $SYS;
$valor = mysql::selecciona('
select `'.mysql_real_escape_string($tipo).'`
from usuarios
where `'.mysql_real_escape_string($tipo).'` = \''.mysql_real_escape_string($dato).'\'
limit 1
', $SYS['MYSQL']['HANDLE'], true);
if($valor[$tipo] == $dato)
return true; // Existe
else
return false; // No existe
}
function carga_sesion(){
global $SYS;
if(!$data = unserialize($_COOKIE['user_data']))
return false; // La cookie no es válida ya que no contiene datos serializados
$id = $data['id'];
$pass = $data['pass'];
unset($data); // Destruye la variable para ser reutilizada
$data = mysql::selecciona('
select *
from usuarios
where id = \''.mysql_real_escape_string($id).'\' and
pass = \''.mysql_real_escape_string($pass).'\'
limit 1
', $SYS['MYSQL']['HANDLE'], true); // Límite de 1 resultado
if($data['id']){
/* Actualiza la fecha del último acceso */
mysql_query('
update `usuarios`
SET `fecha_acceso` = \''.(int)time().'\'
where `id` = 2
limit 1
', $SYS['MYSQL']['HANDLE']);
return $data;
}else{
return false;
}
}
function login($user, $pass){
global $SYS;
$data = mysql::selecciona('
select *
from usuarios
where nick = \''.mysql_real_escape_string($user).'\' and
pass = \''.mysql_real_escape_string(sha1($pass)).'\'
limit 1
', $SYS['MYSQL']['HANDLE'], true); // Límite de 1 resultado
if(!$data['id'])
return false; // No es un usuario válido o se produjo un intento de ataque
/* Devuelve el pass cifrado en SHA1 al igual que la cookie */
/* Establece la cookie del usuario */
setcookie(
'user_data',
serialize(array('id' => $data['id'], 'pass' => $data['pass'])),
false,
'/'
); // Compatibiliza con pernalinks
return $data; // Retorna los datos del usuario
}
function es_mail($email){
/* Verifica atraves de la expresión regular si es correcto */
if(ereg("^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@+([_a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]{2,200}\.[a-zA-Z]{2,6}$", $email)){
$email = explode('@', $email);
/* Verifica que el host del mail existe */
if(@gethostbynamel($email[1])) return true;
else return false;
}else{
return false;
}
}
}
?>
MYSQL.PHP Código PHP:
<?php
if(!$SYS) exit; // Evita la visualización directa
$SYS['MYSQL']['USER'] = 'root';
$SYS['MYSQL']['PASS'] = '123456';
$SYS['MYSQL']['BDATOS'] = 'usuarios';
$SYS['MYSQL']['HOST'] = 'localhost';
// ---------------------------------------------------
$SYS['MYSQL']['HANDLE'] = mysql::crear_handle(
$SYS['MYSQL']['USER'],
$SYS['MYSQL']['PASS'],
$SYS['MYSQL']['BDATOS'],
$SYS['MYSQL']['HOST']
);
$_GET = stripslashses_gpc($_GET);
$_POST = stripslashses_gpc($_POST);
$_COOKIE = stripslashses_gpc($_COOKIE);
$_SERVER = stripslashses_gpc($_SERVER);
function stripslashses_gpc($buffer){
if(!function_exists('get_magic_quotes_gpc'))
return $buffer;
if(get_magic_quotes_gpc()){
if(is_array($buffer)){
foreach($buffer as $variable => $valor){
$temp[$variable] = stripslashses_gpc($valor);
}
return $temp;
}else{
return stripslashes($buffer);
}
}else{
return $buffer;
}
}
class mysql{
function crear_handle($user, $pass, $bdatos, $host){
if(!$handle = mysql_connect($host, $user, $pass))
return false; // Imposible conectar
if(mysql_select_db($bdatos, $handle)){
return $handle; // Retorna el manipulador
}else{
return false; // La base de datos no existe
}
}
function selecciona($query, $handle, $una_columna = false){
if(!$query = mysql_query($query, $handle))
return false; // La query falló
else{
while($fila = mysql_fetch_array($query, MYSQL_ASSOC)){
$retorno[] = $fila; // Llena la variable con las filas retornadas
}
@mysql_free_result($query); // Livera memoria
}
if($una_columna)
return $retorno[0]; // Devuelve una sola columna
return $retorno; // Devuelve todas las columnas
}
}
?>
PANEL_USUARIO.PHP Código PHP:
<?php
/* Compatibilidad con acentos y eñes */
header('Content-Type: text/html; charset=iso-8859-1');
/*
Declara la url del script
Nunca declarar $_SERVER['PHP_SELF'] si no saben como
utilizarlo ya que puede causar fallas de tipo XSS
http://www.webcomparte.com/foro/programacion-en-php/evitar-el-cross-site-scripting-(xss)/
*/
$SYS['WEB_SELF'] = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME'];
/* Conección a la base de datos */
include('mysql.php');
/* Función de usuarios */
include('usuarios.php');
/* Si no es usuario lo devuelve hacia nuestro login */
if(!$SYS['user'] = user::carga_sesion()){
header('location: ingresar.php');
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//ES" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="es-CL" xml:lang="es">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Panel de usuario</title>
</head>
<body>
<h3>Bienvenido <?php echo htmlspecialchars($SYS['user']['nombre'], ENT_QUOTES); ?> !</h3><br />
<strong>Tus datos personales:</strong><br />
<table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">
<tbody>
<tr>
<td width="150">Id de usuario</td>
<td><?php echo (int)$SYS['user']['id']; ?></td>
</tr>
<tr>
<td width="150">Nick</td>
<td><?php echo htmlspecialchars($SYS['user']['nick'], ENT_QUOTES); ?></td>
</tr>
<tr>
<td>Nombre</td>
<td><?php echo htmlspecialchars($SYS['user']['nombre'], ENT_QUOTES); ?></td>
</tr>
<tr>
<td>Mail</td>
<td><?php echo htmlspecialchars($SYS['user']['mail'], ENT_QUOTES); ?></td>
</tr>
<tr>
<td>Última fecha de acceso</td>
<td><?php echo htmlspecialchars(date('d/m/Y H:i:s', $SYS['user']['fecha_acceso']), ENT_QUOTES); ?></td>
</tr>
</tbody>
</table>
<br />
<strong>Datos del sistema:</strong><br />
<?php print_r($SYS); /* borrar esta linea si van a utilizar este sistema */ ?>
</body>
</html>