sábado, 15 de septiembre de 2012

Ya se PHP: ahora ¿qué?

Es muy común que gente sin experiencia o formación en el mundo de la programación aprenda por su cuenta PHP. Esto suele llevar a que cuando se quiere poner en práctica lo aprendido se haga un mal trabajo, acabando con un montón de código espagueti inmantenible, y plagado de agujeros de seguridad. De hecho, esto es uno de los factores que ha dado mala fama al lenguaje.

Por eso hoy voy a escribir unos cuantos consejos para quien esté en esa situación. Todos ellos yo mismo los aprendí tras cometer errores, y a veces por las malas. Se plantearán enfocados al caso de un programador que ya sabe PHP, y quiere hacer una pequeña web con un formulario de login y otro de registro de usuarios.

1. ¿Cómo acceder a la base de datos?

Instintivamente un novato tiende a usar las funciones como mysql_query, ya que es lo que se ve en muchos tutoriales anticuados, a pesar del aviso en rojo que indica que está desaconsejado. No es conveniente usar la API clásica (funciones mysql_*). ¿Por qué es mala idea? Porque es una API vieja, que ha sido reemplazada por MySQLi (o PDO), y es muy difícil de usar de forma segura. ¿Qué se debe usar entonces? Es indiferente. Con PDO la API es la misma para cualquier base de datos que se quiera usar, lo cual es una ventaja a tener en cuenta. Por otro lado, MySQLi tiene algunas funcionalidades extra y puede ser más rápido.

Una vez escogido el método, sin importar cual de ellos sea, llega la hora de hacer una query para, por ejemplo, ver si un usuario existe. Y el programador inexperto estará tentado de hacer algo como:
$query = "SELECT * FROM usuario WHERE login=$login";
Aunque se pueda hacer funcionar, no es buena idea concatenar datos del usuario en la query. Esta es la principal causa de inyecciones SQL, aún intentando escapar los datos proporcionados. ¿Entonces cómo debe hacerse? Utilizando prepared statements (sentencias preparadas). No solo por los posibles motivos de eficiencia, sino por la seguridad. Al pasar los parámetros de este modo, se evita tener que escaparlos y, con ello, el riesgo de una inyección SQL.

De todos modos, si tienes el servidor MySQL expuesto a internet y sin contraseña, te van a robar los datos en cuestión de minutos. Por eso es importante hacer "defensa en profundidad", y tomar las medidas de seguridad necesarias también en la propia base de datos:

2. ¿Qué precauciones requiere la base de datos?

Este tema daría para un curso entero, pero hay unas pocas precauciones especialmente importantes que merecen una mención especial.
  • La base de datos no debe ser visible desde internet. Por suerte, ésta es la configuración por defecto en la mayoría de casos, pero tener un firewall nunca está de más.
  • Es mejor utilizar un usuario con los mínimos privilegios posibles en el código PHP. Especialmente grave sería usar el usuario root y sin contraseña.
  • No se deben guardar las contraseñas de los usuarios. Es posible autenticar al usuario sin guardar su contraseña, utilizando un algoritmo hash. Lo ideal es usar bcrypt con un salt distinto en cada usuario. Hay decenas de páginas explicando cómo y por qué hacer esto así.
  • Las copias de seguridad de la base de datos son importantes, y deben custodiarse con sumo cuidado, ya que contienen datos confidenciales. Nunca deben dejarse guardadas en una carpeta pública del servidor.
Hay otros muchos consejos interesantes que se podrían añadir, pero esos cuatro seguramente sean los más relevantes para evitar incidentes de seguridad.

Con esto ya queda visto lo básico en cuanto a bases de datos. Lo siguiente es escribir el código que haga uso de los datos, pero esto también requiere cierto cuidado:

3. ¿Cómo organizar el código?

Sin conocer las "buenas costumbres" al respecto, se tiende a escribir el código PHP que accede a la base de datos mezclado en medio del HTML, duplicado en varias páginas. Se debe separar el acceso a datos del uso de los mismos para evitar ese caos.

La "receta" es sencilla: crear una clase (o módulo) a través de la cual acceder a la base de datos, con funciones para cada funcionalidad expuesta. Por ejemplo, la parte de usuarios se haría mediante una clase con las funciones:
// Parámetros: los datos de registro
// Devuelve: true si se registró correctamente, false en caso contrario
function registrar($login, $pass, $nombre, $email) { ... }

// Parámetros: los datos de inicio de sesión
// Devuelve: true si son correctos, false en caso contrario
function validar($login, $pass) { ... }

// Parámetros: el login del usuario objetivo
// Devuelve: un array asociativo con los datos del usuario (ej: $info['email'])
function info($login) { ... }
¿Por qué hacerlo así? Porque así el código está en un solo fichero, sin repetirse, y fácil de reutilizar en otras páginas que se desarrollen en el futuro, tan solo incluyendo el mismo fichero. Además facilita mucho leer el código cuando no está lleno de mensajes para el usuario, sino que únicamente hace su tarea.

Una vez tengamos las clases necesarias, ya estamos listos para utilizarlas. ¿Cómo juntamos esto con el HTML? Lo mejor es, sin duda, usar plantillas, ya que obligan a hacer la separación de forma correcta. En esto hay opiniones para gustos: algunos preferirán una solución tipo Smarty, y otros preferirán utilizar el propio PHP como motor de plantillas. En cualquier caso, la clave es mezclar lo menos posible la lógica de la página con su presentación.
(Recomiendo encarecidamente leer ejemplos con PHP como motor de plantillas, aunque se decida usar otra cosa.)

Pero aunque hagamos un uso seguro de la base de datos y nuestro código sea mantenible, a la hora de unir las distintas partes de nuestra página surgen nuevos retos:

4. ¿Cómo integrar las distintas páginas?

La duda más básica al respecto suele ser sobre cómo mantener la sesión abierta al cambiar de página. La mejor solución, casi siempre, es utilizando sesiones. Una vez autenticado el usuario, se guarda en la sesión su login, y en todas las páginas se comprueba en la propia sesión, sin usar la función de validar, si el usuario está autenticado. ¿Por qué hacerlo así? Porque es muy sencillo, seguro, y puede evitar errores.

En la comunicación entre páginas es importante tener en cuenta que todos los datos que pasemos a través del usuario (ej: datos POST o GET) pueden ser manipulados por un atacante, por lo que deben validarse. La sesión permite guardar en ella datos sin que el usuario pueda modificarlos, ya que tan solo contiene un ID, mientras que los datos se mantienen en el servidor.

La filosofía de considerar todos los datos del usuario como inseguros puede ahorrar muchos problemas. Por ejemplo, si se validan con Javascript los datos de un formulario, eso no exime de comprobarlos de nuevo desde el código PHP, ya que el usuario puede desactivar (o peor: modificar) el Javascript.

Finalmente, al tener varias páginas es imprescindible evitar la redundancia entre ellas. Si tenemos un menú en cada página, sería una locura repetirlo en cada fichero, ya que sería imposible de mantener. En estos casos, pueden utilizarse plantillas anidadas (ej: una plantilla con el menú, y en el resto de plantillas hacer un include de esa). No es aconsejable usar frames con esta finalidad, por muchas razones. Lo mismo sucede con los estilos: lo ideal es no tener información de estilo en el HTML, sino que se debe cargar de un fichero CSS que se puede compartir entre las distintas páginas.


Hasta aquí los consejos por hoy. Espero que a alguien le resulte de utilidad para aprender algo nuevo, o conocer nuevas opiniones. Cualquier comentario, crítica, o idea alternativa, es bienvenida en los comentarios.
Un saludo.

jueves, 9 de julio de 2009

Seguridad informática

Tras un pequeño parón por los exámenes de Junio, retomamos la actividad del blog!

Debido a que mucha gente parece algo desorientada en el tema de la seguridad en el uso de su PC, hoy publicaré unos consejos para que puedan servir de referencia y quizá eviten algún disgusto. Además, trataré de evitar el lenguaje excesivamente técnico para que nadie se asuste. Finalmente, como el texto es largo y puede hacerse pesado, trataré de que la primera linea resuma en cierto modo todo el párrafo, para los más impacientes.

Sin más, empezamos:

1. Vigila tu software

No instales un programa si no conoces su procedencia o utilidad.
Muchos virus o malwares se propagan por correo y MSN, usando las cuentas de víctimas anteriores. Por tanto, si alguien te envía un ejecutable, no lo aceptes, y no lo abras, salvo que sea algo que le hayas pedido antes.

Algo parecido sucede en muchas webs. Si una web te pide que instales algo para verla, o que aceptes algo, desconfía. Puede ser cierto, pero muchas veces es otro engaño para instalarte malware. En este tema lo mejor es nunca aceptar sin leer primero qué se nos pregunta, y pensar si es normal.

Si decides descargar un programa de internet, hazlo con garantías. No lo descargues de webs desconocidas: asegúrate de estar en la página oficial. Con programas famosos como el eMule o el Ares, hay webs que lo ofrecen para descargar, pero te solicitan pago por ello, o trae incluida publicidad o cosas peores. En la web oficial esto no sucede.

Como extensión de lo anterior, evita el software "pirata". Si bajas un programa ilegalmente, no tienes ninguna garantía de su seguridad. Es cierto que algunos programas son demasiado caros (por ejemplo, el Microsoft Office cuesta desde 150$ la versión para estudiantes, hasta 500$ la profesional), pero casi siempre existen excelentes alternativas gratuitas y legales que podemos usar (siguiendo con el mismo ejemplo, OpenOffice es compatible con el anterior, pero es gratuito).

2. Cuida tus contraseñas

Usa buenas contraseñas y no las compartas con nadie, especialmente con webs.

Una buena contraseña debe contener letras mayúsculas y minúsculas, y números. Además, debemos evitar usar como contraseña nombres o apellidos, fechas, teléfonos... porque alguien que nos conozca podría saberlos, o verlos en cualquier red social que usemos. Tampoco deben ser palabras de uso común (que aparezcan en un diccionario).

Para que nuestras contraseñas sean más sencillas de recordar, hay muchos trucos. Uno que siempre me ha gustado es pensar una frase que nos sea familiar (ej: "En un lugar de La Mancha de cuyo nombre no quiero acordarme"), y quedarnos con la primera letra de cada palabra (en este caso: "E1ldLMdcnnqa"). Así tendremos una contraseña casi aleatoria y fácil de recordar.

Pero más importante incluso que escoger una buena contraseña, es cuidarla. No debemos dársela a nadie, ni siquiera a nuestros amigos. Especialmente, no debemos escribirlas en webs que no sean en las que nos registramos. Por ejemplo, si una web de "ver quien te bloquea en MSN" nos pide nuestra contraseña, no es buena idea dársela. (Pista: esas webs son un timo, y envían publicidad a tus contactos...o cosas peores).

Por último, es conveniente tener una contraseña diferente para las cosas realmente importantes, distinta de la que usemos en el resto de webs. Si usamos la misma en nuestro correo o banco, que en un foro de mecánica, y alguien consigue acceso a ese foro, tendría pleno acceso al correo o al banco. La solución "de compromiso" es tener una para bancos, Ebay, correo, MSN... y otra para el resto de webs donde nos registremos.

3. Cuidado con donde te conectas

Cuando te conectes desde un lugar público, extrema la precaución.

En muchos lugares públicos (como cibers o bibliotecas) los PCs no están tan protegidos como deberían, y es frecuente que haya virus o keyloggers que puedan capturar las contraseñas que escribamos. Además debemos recordar cerrar sesión en todas las webs o servicios que entremos, para evitar que otra persona entre después que nosotros.

Si te conectas desde tu portátil en una "zona Wifi", ten en cuenta que los que estén cerca tuya pueden (con los conocimientos adecuados) ver todo lo que haces online: webs que visitas, conversaciones de MSN, etc. Esto no sucede en las webs cifradas (como el correo), que se reconocen por un candado al lado de la URL. Extrema las precauciones!

4. Cuidado con la falsa sensación de seguridad

Cada instante surgen nuevos riesgos: ten una actitud proactiva.

Un antivirus puede resultar muy util, pero no es perfecto: un virus recién creado probablemente no sea detectado. Además, una vez el PC está infectado, la única solución 100% efectiva para limpiarlo es reinstalar todo. Por eso no te confíes por tener software de seguridad: sigue siendo necesario tener cuidado.

Si tienes información valiosa, haz copias de seguridad periódicas. Muy poca gente las hace, y se dan cuenta de su necesidad cuando ya es demasiado tarde. Hacer backups te puede librar de perder tus archivos (documentos, fotos, ... muchos irreemplazables) en caso de borrado accidental, virus, o fallo del PC. Los DVD son muy baratos, así que no hay excusa para no hacerlas.


Hasta aquí los consejos por hoy.
Quizá puedan parecer muy trabajosos, pero con tomar algunas de las medidas que he citado, evitaríamos muchos problemas de seguridad. Además, no solo están en juego tus datos, archivos, y cuentas: la negligencia de un usuario afecta a todos sus contactos, y puede ayudar a propagar el malware.
Por todo esto, por favor, tomad precauciones.

Un saludo.

lunes, 1 de junio de 2009

Muíños do Folón e o Picón

Este fin de semana hice una visita rápida a los molinos del Folón y del Picón, en el concello de O Rosal. Se trata de una serie de molinos (67 al parecer) usados antiguamente para moler el grano, y que datan del s. XVII.


Estos molinos han sido restaurados recientemente, en 1996, ya que se encontraban en estado de abandono. En la actualidad, el estado es impecable: paredes, techos y puertas están en perfecto estado. Lo único que quizá necesitase atención son las canalizaciones, que la vegetación empieza a obstruir.


La ruta para visitarlos es un paseo de aproximadamente 1Km en cada dirección, a través de caminos entre la arboleda. La fragancia de los eucaliptos nos acompaña mientras cruzamos el regato por las rocas, subimos escaleras entre los molinos, y cruzamos puentes de madera.


La verdad, con tan poco rato no me dio tiempo a ver todo, pero es una visita interesante, especialmente para los amantes de la naturaleza.
Un saludo!

Fuentes:
- Aguarda: Muiños do Picón en O Rosal
- Orosal: Información Turística
- Escoitar: Los molinos del Picón do Folón

jueves, 14 de mayo de 2009

Cabo Silleiro

Hoy os hablaré un poco de Cabo Silleiro.


Situado a apenas 5Km de Baiona, en la parroquia de Baredo, cierra por el sur la ría de Vigo. En él se sitúa el faro Silleiro, que desde 1866 advierte a los barcos de las rocas de la zona. Este fue modificado en 1924, construyendo el nuevo edificio que ahora lo alberga.


Si habéis pasado por la carretera de Baiona, habréis visto que cerca del faro hay cuatro grandes cañones vigilando la costa. Estos pertenecen a la Batería de Costa J4, una base militar a escasos metros del faro, y que actualmente se encuentra en ruinas.


Esta base militar data de la guerra civil, y muchos jóvenes realizaron en ella su instrucción militar. Fue abandonada en los años 80, y tapiadas las entradas del bunker subterraneo que posee. En el exterior se distinguen varias estructuras, todas en estado ruinoso, y que parece un milagro que todavía sigan en pie. Rodeando la base hay un camino que permite ver el exterior de los cañones, y tiene unas vistas realmente hermosas. En el punto más alto podemos ver el antiguo puesto de telemetría, que controla la entrada de la ría.



En cuanto al bunker subterraneo, a pesar de haber sido tapiado, hoy en día es posible acceder mediante un agujero en una pared, o desde el puesto de telemetría, cuyas paredes se derrumbaron en el 2002 cuando fue el desastre del Prestige.

A pesar de estar lleno de pintadas (y cada vez más, por desgracia), es un lugar bastante interesante de visitar. Hay quien cuenta leyendas de miedo sobre el lugar, y alguna gente se asusta bastante al visitarlo, pero parece un lugar seguro y no parece correr riesgo de derrumbe.



La red de túneles resulta sorprendentemente grande para lo que se ve desde el exterior. No faltan las estancias, bifurcaciones, e incluso escaleras. Recorriendo todo el complejo encontramos unas vías como de tren, que probablemente se usaban para el transporte de munición a los cañones, cuyo interior podemos visitar. Eso si, se hace imprescindible el uso de linternas, ya que no hay ni una pizca de luz.



Ya sea por las vistas, o por el encanto de los lugares abandonados, os aconsejo una visita a este lugar, mientras todavía se conserve. Un saludo!

Fuentes:
- Turgalicia: Cabo Silleiro
- Enajenación mundial: El túnel del pánico
- Contando estrelas: La Batería J-4 Cabo Silleiro

Bienvenida

Hola y bienvenidos a este rincon de la red.

Tras varios intentos de mantener blogs temáticos, me decido al final a hacer un blog "unificado" sobre todo lo que siempre he querido contar y no he tenido donde. Los temas que trataré serán sobre cosas que me llamen la atención: informática, lugares interesantes, eventos a los que asistí, etc. Al tener más variedad de opciones, espero no quedarme sin ideas tanto como en anteriores ocasiones.

Se agradecen comentarios, sugerencias, críticas, y cualquier aportación que haga de este proyecto algo más "web2.0".

Sin más, un saludo!