Come mettere in sicurezza un sito in PHP

Come mettere in sicurezza un sito in PHP

Dieci suggerimenti pronti all’uso per garantire la massima sicurezza al vostro sito!

La possibilità che il vostro sito venga attaccato non è sempre all’ordine del giorno in molti casi, ma può diventare improvvisamente concreta e non c’è nulla di peggio che dover correre ai ripari all’ultimo secondo. Prendendo qualche piccolo accorgimento in fase implementativa sarà possibile, di fatto, garantire la massima funzionalità e limitare le possibilità di attacco. Ricordo brevemente che le più diffuse tipologie di attacco sono le seguenti:

  1. SQL poisoning: esecuzione di comandi sul db da parte di utenti non autorizzati, compresa la cancellazione dei contenuti, la modifica di dati e l’accesso a credenziali riservate.
  2. code injection: inserimento ed esecuzione di codice arbitrario sul vostro sito da parte di un utente anonimo, con possibilità di cancellazione delle directory, dei file ed altro ancora.
  3. defacing del sito: un attaccante prende il controllo della pagina e riesce in certi casi addirittura a modificarne i contenuti. Atto eseguito spesso a scopo “dimostrativo” da parte di hacker “etici” (che volevano evidenziare le falle di sistema troppo spesso sottovalutate), ma non è il caso di sottovalutare la cosa in nessun caso.
  4. Denial of Service (Dos): si esplica in varie modalità e serve a bloccare, di solito temporaneamente, l’accesso al vostro sito web. Può essere, ad esempio, un treno di pacchetti da un dispositivo remoto che vengono raccolti da server senza essere mai evasi.

Come muoversi in questo intricato scenario? L’ideale rimane quello di contattare un esperto di sicurezza (e questo va detto a chiare lettere, e vale soprattutto per i portali molto grossi): nella pratica in molti casi è necessario affidarsi alle proprie competenze ed esperienza, seguendo questi dieci consigli basilari.

  1. Utilizzare credenziali di accesso sicure. È un suggerimento che tendono a ripetere un po’ tutti: la password deve essere sempre robusta, difficile da indovinare e facile da ricordare. Eppure in molti casi non è raro che si mantengano credenziali di accesso facili da “bucare”, e per farlo basta semplicemente che l’attaccante vada per tentativi. Nulla di magico o troppo bizzarro: semplici try & test che possono portare il vostro sito ad essere violato per via di credenziali troppo “ingenue”. Non solo: è anche importante utilizzare username che siano poco scontate e differenti, se possibile, da quelle usate di solito (admin, administrator, root, …). Come fare. Modificate la vostra password periodicamente, facendo uso di una che contenga lettere e numeri, se possibile anche punti o altri caratteri non convenzionali.
  2. Assicurarsi che non sia possibile listare le directory. La possibilità di visualizzare il contenuto delle directory del vostro sito non è un rischio enorme di per sè, ma potrebbe fornire indicazioni molto precise all’attaccante e suggerigli strategie per effettuare hacking o sostituzione di pagine (defacing). Come fare. Modificare il file htaccess nella directory di interesse, ed inserire un’unica riga Options -Indexes; eventualmente replicare il procedimento per altrettanti file copiati all’interno di tutte le sottodirectory di interesse o “a rischio”.
  3. Evitare che gli errori del sito escano fuori in output. È una cosa molto utile, in fase di sviluppo (possibilmente in locale o su rete privata) abilitare i controlli di PHP perchè gli errori ed i warning sulle pagine siano sempre visibili. Ma è una pessima idea fare una cosa del genere quando il sito è rilasciato, perchè gli errori possono contenere indizi molto utili ad un attaccante eventuale. Come fare. Inserire nell’header di tutte le pagine il comando error_reporting(0); oppure, in alternativa, settare questo valore direttamente all’interno del PHP.ini (chiedere all’hosting per avere la certezza).
  4. Filtrare tutte le variabili di ingresso $_GET/$_POST. Quando si lavora su CMS realizzati da zero (ma il discorso si potrebbe estendere ai consueti Joomla!, wordpress e via dicendo) oppure ereditati da altri è una delle cose fondamentali fare in modo che queste variabili siano filtrate. Questo perchè non deve essere possibile che un utente possa ad esempio eseguire del codice Javascript (o addirittura PHP o SQL) sfruttando degli opportuni pattern; a tal proposito il suggerimento del punto precedente è molto legato a questa tematica. Di fatto il rischio è legato sia possibilità completamente imprevebili che alla possibilità di effettuare SQL poisoning, ovvero la possibilità che un utente anonimo possa leggere (o peggio ancora scrivere o addirittura cancellare) il contenuto del vostro database. Tra l’altro, in generale, è sempre meglio non utilizzare il metodo GET per il trasferimento di dati quando è possibile sostituirlo con il metodo POST, dato che il primo (al contrario del secondo) pubblica i contenuti delle variabili in chiaro all’interno dell’URL . Se dovete utilizzare POST per trasportare dati sensibili come username e password di un utente, quindi, molto meglio fare in modo che queste informazioni siano criptate con md5 o sha1 (assicurandosi che la stringa non risulti essere troppo lunga: non esistono limiti “ufficiali” per la lunghezza di un URL ma è sempre bene non esagerare, specie su browser come Internet Explorer che potrebbero tagliarlo). Come fare. Il modo più semplice per filtrare le variabili di ingresso è fare uso di apposite funzioni di filtraggio (come questa) e, soprattutto, fare uso degli statement MySQL limitando nel contempo i privilegi sul database (facendo in modo che l’utente MySQL che mostra i dati del sito non sia un superadmin).
  5. Inserire un duplice livello di sicurezza per il login alla parte amministrativa. Si tratta di un procedimento un po’ radicale se volete, ma lo trovo semplicemente insostituibile nel caso in cui si lavori su una sezione amministrativa che sia visibilmente carente o che possieda un login facile e risaputa preda di attacchi esterni. Utilizzando un generatore di file htpasswd potrete proteggere mediante il login di Apache il contenuto di una directory oppure di una pagina specifica. Come fare? Utilizzando un’utility come questa (se non funziona provate a cercare “htpasswd generator” su Google) potrete generare un elenco di credenziali (username1, password1), (username2, password2), … che risulteranno valide per accedere alla pagina riservata. In questo caso è anche necessario modificare il file .htaccess in modo opportuno, in modo da informare Apache della direttiva di sicurezza che avete inserito.
  6. Utilizzare un web hosting che abbia a cuore la sicurezza. Diverso tempo fa avevo raccontato la mia cattiva esperienza con Byethost, che non aveva esattamente tra le sue prorità la sicurezza dei siti che ospitava. Non esiste l’hosting sicuro in assoluto e questo va detto a chiare lettere, ma in certi casi ci sono provider che non effettuano alcun controllo e, nel contempo, posso dire di essermi trovato piuttosto bene con Bluehost (fin troppo zelante in certi casi) e con Supporthost.
  7. Assicuratevi, infine, che il register_globals del vostro sito sia correttamente settato, perchè in certi casi questa circostanza viene del tutto trascurata ed il pericolo è concreto. Ne ho parlato in un articolo apposito, per cui non mi dilungo ulteriormente.

Per maggiori informazioni consultate il sito phpsec.org/projects/guide oppure procuratevi qualche manuale appositamente dedicato all’argomento.

Ti piace questo articolo?

3 voti

Su Trovalost.it puntiamo sulla qualità dei contenuti da quando siamo nati: la tua sincera valutazione può aiutarci a migliorare ogni giorno.

Ti potrebbero interessare (Guide per webmaster):

Cerca altro nel sito

Clicca sul box, e scegli la sezione per vederne i contenuti.

Come mettere in sicurezza un sito in PHP

Dieci suggerimenti pronti all’uso per garantire la massima sicurezza al …
[ 16.098612288668 ] 3 utenti hanno votato questa pagina