jueves, 29 de octubre de 2009

Proyecto Web (Parte 2)

A paso de tortuga la cosa sigue avanzando. Ya he registrado un dominio gratuito, pero no por ello malo (la verdad es que tiene muy buenas cosas este servidor) y ya he alojado lo que llevo de web. Aun no hay nada, pero ya he metido un sencillito formulario de registro y se puede acceder al sistema tras registrarse.

La unica diferencia por ahora es el boton de logout.

Por ahora la autenticación y el método para mantenerse conectado son mediante el uso de cokies, pero mas adelante implementaré el uso de sesiones y, si el usuario lo desea, guardar la informacion mediante cookies, ya que las cookies dependen del navegador y podemos tenerlas desactivadas o desactivarlas, y si permitimos que solo se mantenga conectado con cookies pues es posible que la web no nos mantenga logados.

Podemos ver como va el proyecto en la url http://turkos.freetzi.com

El proyecto final, debido a la coña de montar una empresa de asesinos a sueldo debido a la crisis financiera y economica mundial, se ha titulado "The Turks", es decir, "Los Turkos" o "los Turcos", porque como todas mis cosas, o al menos la mayoría, están relacionadas con Final Fantasy VII ^^.

El sitio tiene la siguiente estructura:

[raiz del sitio]
|__[images]
|_______ contiene imagenes del sitio
|__[includes]
|_______ header.php (cabecera de la web)
|_______ footer.php (pie de la web)
|_______ funciones.php (archivo donde colocar las funciones usadas en la web)
|_______ configuracion.php (parámetros de configuracion del sitio)
|__ template_css.css (hoja de estilo en cascada)
|__ animatedcollapse.js (javascript de menus interactivos)
|__ index.php (cuerpo de la web)
|__ registrar.php (script que registra a los usuarios)
|__ ingresar.php (script que loguea a los usuarios)
|__ login.php (script qur comprueba las cookies y si el usuario está logado)

Primero hablaré del registro. Yo lo tengo en el mismo index.php pero puede estar en cualquier sitio. La cuestion es un formulario simple que envie una serie de datos mediante POST a otro archivo, que los procesará para realizar el registro. Esto se consigue con el parámetro ACTION="registrar.php". Se pone así porque el archivo registrar.php lo tengo en el mismo directorio que el archivo que ejecuta el codigo (en este caso el index.php). Si registrar lo tuvieramos, por ejemplo, en un directorio llamado "reg" entonces tendriamos que poner ACTION="reg/registrar.php". Y si el archivo que tiene el formulario está en la carpeta "reg" y el archivo registrar.php estuviera un nivel por debajo pondríamos ACTION="../registrar.php". Basta de tonterías, el código del formulario es el siguiente:

                <FORM ACTION="registrar.php" METHOD="post">
                <table align="left" border="0" cellspacing="0" cellpadding="1">
                    <tr><td align="left">Nick:</td><td align="right"><input type="text" name="nick" size="14"></td></tr>
                    <tr><td align="left">Pass:</td><td align="right"><input type="password" name="password" size="14"></td></tr>
                    <tr><td align="left">Name:</td><td align="right"><input type="text" name="nombre" size="14"></td></tr>
                    <tr><td align="left">Email:</td><td align="right"><input type="text" name="email" size="14"></td></tr>
                    <tr><td colspan="2" align="center"><INPUT TYPE="submit" CLASS="boton" VALUE="Registrar"></td></tr>
                </table>
                <br>       
                </FORM>

Cada input, es decir, cada caja de texto le damos un nombre para identificarlo. Cuando enviémos el formulario, registrar.php recibirá por POST informacion contenida en cada input, que capturaremos con la variable $_POST["nombreDeCajaDeTexto"].

Ahora vamos al archivo registrar, que lo explicaré por partes. Este archivo empieza así:

<?php
//incluimos datos de configuracion del servidor
require('includes/configuracion.php');
//incluimos archivo con funciones a usar
require("includes/funciones.php");
conectar() or die('No se puede conectar a la Base de Datos!');

Tendremos que conectarnos a la base de datos, y para ello requerimos los parámetros de configuración, así que por eso, antes de conectar con la base de datos, tendremos que tener presente el contenido de estos dos archivos, uno que define los parámetros del servidor para la base de datos y otro porque es donde se alojan las funciones que hacemos. conectar() llama a la funcion, sin require("includes/funciones.php"); no tendríamos nada que hacer.

Antes de seguir viendo registrar.php veamos estos dos archivos, donde configuration.php sería algo así:

<?php
//BASE DE DATOS
define('SERVIDOR', 'servidor'); //en local, por ejemplo, seria "localhost"
define('USUARIO_BD', 'usuariodelabasededatos'); //por defecto "root"
define('PASSWORD_BD', 'contraseñadelabasededatos'); // Con xampp, por defecto sin contraseña
define('NOMBRE_BD', 'nombredelabasededatos'); //nombre de la BD cuando la creamos con phpmyadmin, por ejemplo
?>

Mientras que funciones.php sería un recopilatorio de funciones. Yo pondré mis 2 funciones que tengo por ahora, una para conectar, y la otra para eliminar de lo que se escriba en las cajas de texto simbolos html o espacios, para que no nos intenten joder la web con simple inyección SQL:

<?php
  function conectar($server = SERVIDOR, $username = USUARIO_BD, $password = PASSWORD_BD, $database = NOMBRE_BD, $link = 'db_link') {
    global $$link;
    $$link = mysql_connect($server, $username, $password);

    if ($$link) mysql_select_db($database);
       return $$link;
  }
 
function quitar($mensaje)
    {
    $mensaje = str_replace("<","&lt;",$mensaje);
    $mensaje = str_replace(">","&gt;",$mensaje);
    $mensaje = str_replace("\'","'",$mensaje);
    $mensaje = str_replace('\"',"&quot;",$mensaje);
    $mensaje = str_replace("\\\\","\\",$mensaje);
    return $mensaje;
    }
?>

Bien bien, ahora sigamos con registro.php. Lo unico que tenemos en un if-else que nos comprueba primeramente que si los campos a rellenar estuvieran vacíos. De no rellenar ningun campo mandaría la página a index pasando una variable por GET con un mensaje. Este mensaje, en el index, podremos capturarlo y mostrarlo con una simple linea:

if ($_GET["msg"]) echo "<font color='ff0000'>".$_GET["msg"]."</font><br>";

Veamos el if-else

if(trim($_POST["nick"]) != "" || trim($_POST["pass"]) != "" || $_POST["nombre"]) != "" || trim($_POST["email"]) != "")
    {

    }
else
    {
    header('Location: index.php?msg=Rellene bien los campos');
    }

mysql_close();
?>

Ahora veamos lo que habrá dentro de la sentencia if. Básicamente hacemos una consulta a la base de datos que nos diga si hay algun usuario con ese nick enviado. Si lo hay, enviamos al index.php con un mensaje (igual que el mensaje si los campos estaban vacíos), y si no lo hay pues insertamos en la base de datos los datos puestos por el usuario y mandamos al usuario al index.php con un mensaje de exito al registrar:

    $sql = "SELECT id FROM usuarios WHERE nick='".quitar($_POST["nick"])."'";
    $result = mysql_query($sql);
    if($row = mysql_fetch_array($result))
        {
        header('Location: index.php?msg=¡Nick ya existente!');
        }
    else
        {
        $sql = "INSERT INTO usuarios (nick,pass,nombre,email) VALUES (";
        $sql .= "'".quitar($_POST["nick"])."'";
        $sql .= ",'".md5(quitar($_POST["password"]))."'";
        $sql .= ",'".quitar($_POST["nombre"])."'";
        $sql .= ",'".quitar($_POST["email"])."'";
        $sql .= ")";
        mysql_query($sql);
        mysql_free_result($result);
        header('Location: index.php?msg=¡Registro Exitoso!');
        }

Y con esto ya hemos registrado al usuario y acabado esta entrada

3 comentarios:

  1. Nas Kini!

    Está bien pensao esto de ir comentando como va evolucionando el proyecto.

    Te escribo para hacer una sugerencia :)
    No sé si las conoces, pero en PHP existen varias formas de sanear lo que la gente escribe (para evitar que te jaqueen la web), y son muy potentes. Vienen a hacer lo que haces tu con quitar(), pero, ¿para que reinventar la rueda, no?

    Son strip_tags, htmlspecialchars, htmlentities entre otras. Y el uso es igual, función($var). El htmlentities te puede traer algún quebradero de cabeza si quieres usar UTF-8, pero weno...

    Y ahí queó :D

    ResponderEliminar
  2. Muy chulo Kini, me he registrado así tienes más users no-admins para hacer tus pruebas.

    Seguiré esto. ;-)

    ResponderEliminar
  3. Nunca llegué a responder, pero sí, es posible olvidarnos de la función quitar() y sustituirla por htmlspecialchars(), o cualquiera de las que comentas.

    strip_tags() no la conocía, pero si stripslashes().

    Si bien hay servidores que tienen capadas diversas funciones de php, o si bien muchas funciones de php están incluidas en alguna version de php que puede que no tengamos disponible, tendremos que tener a mano herramientas para saber qué hacer con el código e intentar hacerlo un poco más seguro.

    ResponderEliminar

Responde o Mystra te castigará