Jueves, 18 Marzo 2010 18:18

Haz tus extensiones de Joomla más seguras

Escrito por 
CMS:  Joomla! |  Versión:  Todas |  Nivel de dificultad:  Medio |  Tiempo estimado de lectura:  20 minutos


Seguridad en JoomlaLa seguridad es un factor importantísimo a la hora de realizar un desarrollo web. Joomla es una excelente plataforma donde realizar estos desarrollos, que nos permitirá reutilizar nuestro código y nuestras extensiones en cualquier sitio, y que además nos ofrece una gran libertad para realizar lo que necesitemos.

Pero hay que tener cuidado, las aplicaciones web suelen estar abiertas a todo el mundo, lo que significa que estamos potencialmente en el punto de mira de muchos ojos maliciosos que pueden intentar romper nuestra seguridad para acceder a nuestro sistema y hacerse con nuestra información tan preciada.


Afortunadamente , Joomla viene al rescate con un API repleta de métodos y funciones que nos harán la vida más fácil a los programadores de aplicaciones en Joomla.

Inyección SQL

Uno de los problemas más comunes y catastróficos es el de las inyecciones SQL. Una inyección SQL puede acabar con toda la información de tu sitio web y, por consiguiente, con todo tu sitio. Para tratar de evitarlas hay que procesar los datos que vienen desde el exterior con los métodos apropiados del API de Joomla. A continuación se enumeran algunas de estas funciones que incorpora el API de Joomla.

  • $db->quote
  • $db->nameQuote
  • $db->getEscaped
  • JRequest
  • JFilterInput

Vamos a ver cómo usarlas.

 


$db =& JFactory::getDBO();
$tabla = $db->nameQuote('nombreDeTabla');
$columna = $db->nameQuote('nombreDeColumna');
$literal = "<img src="/’imagen.jpg’" alt="’imagen’" />";
$sql = "SELECT * FROM $tabla "
. "WHERE $columna " . ' = '
. $db->Quote($literal);

$db->setQuery($sql);
$db->query();

El método getDBO() devuelve el objeto JDatabase. El método nameQuote entrecomilla los identificadores de tabla y de columna respectivamente. Mientras que el método Quote entrecomilla el literal. El resultado final de las variables es el siguiente:

$tabla

'nombreDeTabla'

$columna

'nombreDeColumna'

$literal

'<img src="/src" alt="imagen" />'

También existe el método getEscaped, que devuelve el string escapado, pero no entrecomillado. El método quote devuelve el string escapado y entrecomillado.

De esta forma evitaremos que fallen algunas consultas donde se usan palabras reservadas de MySQL, muy común y muy difícil de detectar y, además evitaremos que algunos usuarios maliciosos intenten modificar nuestra consulta SQL jugando con las variables de entrada.

Filtrando valores numéricos

Para limpiar valores numéricos podemos usar JRequest de la siguiente manera:

 


// Enteros
$safeInt = JRequest::getInt('int');
$safeInt = JRequest::getVar('int', 0, 'DEFAULT', 'INT');
$safeInt = JRequest::getVar('int', 0, 'DEFAULT', 'INTEGER');

// Floats
$safeFlt = JRequest::getFloat('float');
$safeFlt = JRequest::getVar('float', 0, 'DEFAULT', 'FLOAT');
$safeFlt = JRequest::getVar('float', 0, 'DEFAULT', 'DOUBLE');

Una vez hecho esto ya podemos usar los valores numéricos para construir nuestra sentencia SQL sin temor de que alguien modifique intencionalmente nuestra base de datos.
Estos son algunos de los métodos de los que nos provee Joomla para “securizar” la entrada de datos, consulta la documentación oficial si quieres indagar más.

En general, el objeto JRequest es recomendable usarlo adecuadamente siempre que obtenemos datos de los arrays de entrada, esto evitará posibles disgustos con los "chicos malos".

Evitando el Cross-Site Request Forgery (CSRF)

El CSRF es una debilidad del software muy común y muy poco tomada en cuenta por desarrolladores noveles.
En el típico escenario CRUD (Create Read Update y Delete), imagina que para borrar determinado dato debemos de acceder a la siguiente URL:

index.php?option=com_micomponente&task=delete&id[]=4

Una llamada a la anterior URL borraría el elemento con ID 4 de mi componente. Imagina que ahora alguien toma control de tu ordenador y se dedica a enviar URLs de este tipo con tu ordenador sin que te enteres, o alguien coloca una URL maliciosa en un foro con el "anchor text" pulsa aquí, pero que realmente está apuntando a la dirección anterior. En definidas cuentas, no podemos confiar en que un usuario logueado es un usuario confiable, porque no siempre va a ser el usuario en sí quien realice estas peticiones HTTP. Una posible solución a esto, y muy recomendable, es bajar el tiempo de sesión para que expire en un lapso de tiempo cuanto más pequeño mejor y, además, evitar navegar por internet mientras uno está logueado en el sistema Joomla.
Pero esto es sólo una recomendación que minimiza las posibilidades de ataque, no ataja el problema de raíz. Para solucionar esto debemos usar el Token que crea Joomla, "testigo" si lo traducimos al español.
La forma de uso es muy sencilla y consiste en, como su nombre indica, pasarse el testigo de una página a otra.
Cuando creamos un formulario deberemos incluir una llamada a JHTML::_( 'form.token'). Esto crea un campo de tipo hidden en el formulario, que contendrá un identificador único que caducará en cada petición. Luego desde el task tendremos que comprobar que el token es correcto, esto lo haremos con el método JRequest::checkToken().

A continuación un ejemplo:

<form method="post">

Nombre:

<input name="nombre" type="text" />

Email destino:

<input name="email" type="text" />

Cuerpo:

<input name="cuerpo" type="text" />

<input type="submit" value="Enviar Email" />



<input name="option" type="hidden" value="com_prueba" />

<input name="task" type="hidden" value="enviarEmail" />

</form>

Task que recoge el formulario

function enviarEmail(){
JRequest::checkToken() or die( 'Token invalido' );

echo "email enviado!!";
}

Si usamos el método GET, el código para crear el token es el siguiente:


<a href="/">Eliminar</>

function eliminar(){
JRequest::checkToken( 'get' ) or die( 'Token invalido' );
echo "Usuario eliminado!!";
}


De esta forma evitaremos que alguien se aproveche de nuestra sesión para enviar peticiones HTTP maliciosas.
Estas son algunas recomendaciones, hay más temas a tratar, nunca des por sentado que tu web es segura solamente aplicando estas recetas.

Te dejamos unas cuantas direcciones de interés para que les eches un vistazo.


¿Te ha resultado interesante este artículo?

Suscríbete para recibir consejos exclusivos para WordPress, Joomla y PrestaShop



David Noguera

Miembro del equipo de sistemas de webempresa.com Google+