Joomla: sviluppo e sicurezza

Negli ultimi mesi la comunità di sviluppatori del progetto Joomla! si è animata molto. In particolare per quel che riguarda il problema della sicurezza. Oltre a numerose guide, tutorials, elenchi di estensioni di terze parti potenzialmente dannose, ecc. ecc., è stato creato un team che si occupa esclusivamente della sicurezza.

Tra le risorse più utili, voglio segnalare questo breve schema dedicato a chi vuol sviluppare autonomamente le proprie estensioni.

Secondo l’autore, non è completamente sufficiente ricorrere alla classe JRequest. Ci sono alcune buone pratiche da seguire per rendere il codice più sicuro di fronte ad intrusioni tramite SQL. Ecco i suoi consigli per prevenire le SQL injections e gli attacchi XXS:

Forza il tipo di dati

Se aspetti un integer, forza il tipo in modo da ottenere un integer (o un float). Ad esempio:
$sql = ‘UPDATE #__mytable SET `id` = ‘ . (int) $int;

Se vuoi inserire una data, usa JDate, e otterrai ogni volta una data in formato mysql:
$date =& JFactory::getDate($mydate);
$sql = ‘UPDATE #__mytable SET `date` = ‘ .
$db->quote( $date->toMySQL(), false);

Fai sempre l’escape delle stringhe

Ogni volta che l’utente invia una stringa dovresti farne l’escape:
$sql = ‘UPDATE #__mytable SET `string` = ‘ .
$db->quote( $db->getEscaped( $string ), false );

Prevenire attacchi DOS

In una clausola WHERE, se usi il comando LIKE, puoi avere una vulnerabilità DOS se non fai l’escape delle wildcards % e _.
Joomla consente di prevenire questa eventualità. $db->getEscaped può avere un secondo parametro che effettua l’escape delle wildcards.
Si ricordi che bisognerebbe fare l’escape di questi caratteri per le stringhe usate col comando LIKE. Così:
$sql = ‘UPDATE #__mytable SET …. WHERE `string` LIKE ‘.
$db->quote( $db->getEscaped( $string, true ), false );

Prevenire attacchi XXS

La maggior parte dei programmatori ottiene i dati ricorrendo a JRequest::getVar(). Ma ci sono altri metodi che, in realtà, forzano molto meglio il tipo di dati. Eccone alcuni:

Per gli interi:
$int = JRequest::getInt( $name, $default );

Per i float (decimali):
$float = JRequest::getFloat( $name, $default );

Per i valori booleani (true/false):
$bool = JRequest::getBool( $name, $default );

Per “parole” (consente solo caratteri alfabetici, e il carattere _ ):
$word = JRequest::getWord( $name, $default );

Per i “commands” (consente caratteri alfabetici, numerici, . – e _ ):
$cmd = JRequest::getCMD( $name, $default );

Per testo NON-HTML (tutto il codice HTML verrà eliminato):
$string = JRequest::getString( $name, $default );

Annunci