Aumentar la seguridad de una base de datos en SQLite

por Mariana Cabral en Junio 4, 2012

Invitado de lujo el que tenemos esta semana en nuestro blog, quien comienza con una serie de posts especiales relacionados con sus más recientes aportaciones a video2brain: José Vicente Carratalá, también conocido en la Comunidad v2b como «jocarsa». ¡Que lo disfruten!

¿Qué es SQLite?
SQLite es un sistema de gestión de bases de datos ligero, potente y rápido. Se basa en una base de datos situada en el sistema de archivos, generalmente con extensión *.db.

Entre sus ventajas, podemos enumerar la flexibilidad, la rapidez en los desarrollos y lo tremendamente fácil que es migrar una app web que use Sqlite: En la mayoría de los casos, copiamos y pegamos la aplicación en la nueva ubicación y funciona a la primera. Además, al ser una base de datos controlada enteramente por PHP, los hosting no suelen poner limitaciones en su uso.

Entre sus desventajas, podemos citar dos: En primer lugar no suelen aceptar usuario y contraseña. Y, lo más importante, al ser un tipo de base de datos basada en un archivo, este archivo se puede descargar directamente desde el navegador, comprometiendo la seguridad de nuestra aplicación.

Por ejemplo, en un sistema linux, la carpeta de publicación web suele estar en /var/www. En un sistema Windows, si usamos XAMPP, estaría en C:/XAMPP/htdocs/ Supongamos que, dentro de www creamos una carpeta llamada app, que contiene una carpeta llamada db, que a su vez contiene a la base de datos basededatos.db. La ruta completa desde el sistema de archivos sería:/var/www/app/db/basededatos.db en linux, y C:/XAMPP/htdocs/app/db/basededatos.db en Windows. En cualquiera de los dos casos, la ruta para acceder desde el exterior al servidor, sería: http://www.[dominio].[ext]/app/basededatos.db, lo que quiere decir que, en la práctica, cualquier persona que conozca el nombre y la ubicación de la base de datos, se la puede bajar simplemente llamándola desde cualquier navegador web. ¿Y que pasaría con cualquier persona que no conociera estos datos? Bueno, se podría programar un bot que se dedicara a ir probando hasta:
1.-Acertar la base de datos.
2.-Sobrecargar el servidor de peticiones.
(La creación de bots será tratada en un artículo futuro)

¿Qué podemos hacer para asegurar nuestras bases de datos en SQLite?
Un truco muy sencillo, si nuestro proveedor nos lo permite, o si estamos usando un servidor propio, es situar la base de datos en una carpeta externa a la carpeta www.
Por ejemplo, en un sistema linux, podemos crear la carpeta /var/db al lado (al mismo nivel) de la carpeta /var/www, o en un sistema Windows podemos crear la carpeta C:/XAMPP/db/ al lado de la capeta C:/XAMPP/htdocs. De esta manera, la carpeta /db ya no es accesible directamente desde el exterior.

¿Y cómo puede acceder nuestro programa a ella?
Supongamos el siguiente ejemplo:
La base de datos está en /var/db/basededatos.db
El script que quiere acceder a la base de datos está en /var/www/app/index.php

Dentro del script PHP, al conectar con la base de datos, solo tendríamos que escribir:
$conexion = sqlite_open(‹../../db/basededatos.db›);
Si estamos en la carpeta /var/www/app/index.php, el primer «../» hace que bajemos hasta /var/www/, el segundo «../» hace que bajemos hasta /var/, «db/» hace que entremos en /var/db/, y por último, seleccionamos la base de datos por su nombre.

Gracias a este sencillo truco, que básicamente consiste en sacar la base de datos SQLite de la carpeta pública, podemos seguir disfrutando de las ventajas de SQLite, a la vez que aumentamos su seguridad.

José Vicente Carratalá

  • Tl3

    Mariana te amoOoOo!!!

Publicación anterior:

Publicación siguiente: