Este artículo de Anthony Ferrara traducido por zaragozasource.es explica cómo protegernos de los ataques de inyección SQL al programar extensiones en Joomla! 1.5
Nos comenta que JRequest no es sufiente por si sólo para protegernos de éste tipo de ataques.
Vamos a repasar una serie de funciones que nos ayudarán a estar mejor protegidos:
Lo primero que debemos hacer es que si esperas un integer, forzar la variable recibida a que lo sea, lo mismo si es float, etc…
Por ejemplo:
$sql = ‘UPDATE #__mytable SET `id` = ‘ . (int) $int;
(hemos forzado a introducir un entero en la instrucción SQL, para evitar sorpresas)
Si en cambio estamos esperando una fecha usaremos JDate, y nos aseguraremos así que introducimos en la cadena SQl una fecha válida para mysql.
$date =& JFactory::getDate($mydate);
$sql = ‘UPDATE #__mytable SET `date` = ‘ . $db->quote( $date->toMySQL(), false);
Las cadenas de texto han de pasarse siempre por la función getEscaped:
$sql = ‘UPDATE #__mytable SET `string` = ‘ . $db->quote( $db->getEscaped( $string ), false );
Ojo, que estamos usando aquí la función quote(). Podemos simplificar la expresión dejando el segundo parámetro a true o en blanco (true por defecto).
$sql = ‘UPDATE #__mytable SET `string` = ‘ . $db->quote( $string );
Previniendo ataques DOS
Si estás utilizando el comando LIKE, puedes tener una vulnerabilidad DOS por no “escapar” los carácteres especiales % y _.
Joomla te facilita esta operación. $db->getEscaped puede tener un segundo parámetro que los “escapará” por tí.
$sql = ‘UPDATE #__mytable SET …. WHERE `string` LIKE ‘.
$db->quote( $db->getEscaped( $string, true ), false );
Previniendo ataques XSS
Hay métodos parecidos a JRequest que fuerzan las variables a comportarse como queremos
Integers:
$int = JRequest::getInt( $name, $default );
Floats (decimales):
$float = JRequest::getFloat( $name, $default );
Boolean (verdadero/falso):
$bool = JRequest::getBool( $name, $default );
Words (palabras, sólo letras y _)
$word = JRequest::getWord( $name, $default );
Commands (Alfanuméricos, – y _ )
$cmd = JRequest::getCMD( $name, $default );
Texto libre de HTML:
$string = JRequest::getString( $name, $default );
Artículo original en inglés:
http://developer.joomla.org/security/articles-tutorials/258-preventing-sql-injections.html
No related posts.

