====== API PHP-Fusion 6.x ====== Sappiamo che la sicurezza in un CMS come PHP-Fusion è una cosa essenziale. Qui trovate una breve ma esauriente guida contenente tutte le informazioni necessarie per sviluppare nuove infusions o modificare agevolmente il core di PHP-Fusion. ===== Diritti utente ===== Per verificare livello e gruppo degli utenti, utilizzate sempre le costanti iGUEST, iUSER, iMEMBER, iADMIN, iSUPERADMIN, iUSER_RIGHTS, iUSER_GROUPS e le funzioni: * checkrights($right): controlla se l'utente attualmente loggato ha diritti per accedere ad una particolare funzionalità, contraddistinta da una o più lettere dell'alfabeto. * getuserlevel($userlevel): mostra il corrispondente locale tradotto per il livello utente passato (solitamente 101, 102 o 103 rispettivamente per membro, amministratore e superamministratore) * checkgroup($group): ritorna true se l'utente appartiene al gruppo specificato, dove gruppo può esser 101,102,103, oppure l'id di un gruppo definito. Esempio di uso delle costanti: if (iMEMBER) echo "Benvenuto membro"; else echo "Benvenuto utente anonimo"; ===== Chiamate MySQl ===== Utilizzate sempre le funzioni incluse in PHP-Fusion per eseguire le vostre query (interrogazioni): * **dbquery($query)**: per effettuare una query mysql; * **dbrows($query)**: per conoscere il numero di righe restituite dalla query; * **dbcount($campo, $tabella, $condizioni)**: restituisce la somma dei valori del campo $campo all'interno di tutte le righe di $tabella che corrispondono alle $condizioni specificate (opzionale, nullo per tutti); * **dbresult($query, $campo)**: per ottenere il dato contenuto in $campo relativo alla prima riga di $query; * **dbarray($query)**: inserisce i risultati di $query, all'interno di un array associativo; * **dbarraynum($query)**: inserisce i risultati di $query all'interno di un array posizionale; Esempi d'uso: // Effettuo la query $result = dbquery("SELECT * FROM ".$db_prefix."custom_pages WHERE page_id='$page_id'"); // Controllo che la query abbia restituito almeno una riga if (dbrows($result) != 0) { // Butto i risultati in un array posizionale $data = dbarray($result); // Utilizzo i dati richiesti echo $data['page_title']; } else die("Errore nella query"); ===== $_POST and $_GET ===== Ricordatevi sempre di eliminare dalle stringhe in arrivo dai client codice HTML o PHP potenzialmente pericoloso. Utilizzate la funzione stripinput() prima di inserire qualcosa nelle vostre tabelle mysql. Esempio: $my_data = stripinput($POST['my_data']); Questa funzione rimpiazza determinati caratteri con le relative entità HTML (ad esempio, le doppie virgolette “ diventano " ) Se la vostra variabile POST/GET deve essere un numero, utilizzate la funzione isNum(). Se un numero inviato (come parametro) è utilizzato in una vostra query mysql, utilizzate un codice come quello che segue prima di metterlo in una tabella mysql: if (!isNum($_POST['my_number'])) falback("index.php"); in alternativa: $my_number = isNum($_POST['my_number']) ? $_POST['my_number'] : $my_default_number; In sostanza, fate dei controlli formali sulla consistenza delle variabili. Non inviate mai tramite il metodo GET dati importanti come le password (viaggiano “in chiaro”). Cercate di manipolare il database mysql tramite campi ID. Sono più facili da gestire, ed è anche più sicuro. E’ più facile verificare che un valore sia numerico (tramite la già discussa funzione isNum() ) piuttosto che parsare (elaborare) una stringa e stabilire se sia sicura o meno. ===== Altro ===== - Aggiungete sempre questo codice all’inizio del vostri script di amministrazione delle infusion: if (!checkrights("IP")) fallback("../index.php"); - Aggiungete sempre questo codice all’inizio del vostri script delle infusion (pannello): if (!defined("IN_FUSION")) { header("Location:../../index.php"); exit; } - Aggiungete sempre questo codice all’inizio delle vostre pagine incluse: if (!defined("IN_FUSION")) { header("Location:../index.php"); exit; } - Verificate sempre le immagini inviatevi tramite la funzione verify_image(). Ricordate che alcuni browser (voi sapete QUALE ;) ) possono eseguire script JS pericolosi tramite tag HTML. - Non abbandonate gli e_notice warnings a loro stessi. Ricordate di dichiarare le variabili ed inizializzarle con un valore di default. Esempio senza dichiarazione: $otherdata = 'a'; $data = array('b', 'c', 'd'); for ($i=0;$i if ($otherdata==$data[$i]) $result = "OK"; } $final_result = $result; Lo script appena proposto causa un warning (e_notice): e_notice warning: Variable $result not defined at line XXX. Quello sotto è lo script corretto, che non genera nessun warning: $otherdata = 'a'; $data = array('b', 'c', 'd'); $result = "DEFAULT VALUE"; //questa linea risolve il problema rimuovendo il warning for ($i=0;$i if ($otherdata==$data[$i]) $result = "OK"; } $final_result = $result;