Aumenta la Sicurezza del tuo Codice con i Nonce

Sono ormai diversi anni che sentiamo dire che "WordPress non è sicuro" ma se prendi il tempo di studiare questa piattaforma scoprirai che nel suo core è molto sicura, il vero problema sono i temi e i plugin installati al suo interno...

Forse ti stai chiedendo il perché di questa mia affermazione e onestamente sono molto felice di risponderti con questo articolo! Man mano che proseguiremo nel testo verrai a conoscenza di un elemento integrato all’interno di WordPress che ti permette di rendere il tuo codice sicuro e rilasciare dei prodotti professionali.

Se devo essere onesto, scrivo questo articolo non soltanto per farti conoscere una tecnica che ti permetterà di conoscere meglio questa piattaforma ma lo faccio anche perché ho intenzione di sfatare il mito che mette WordPress in cattiva luce; visto che tanti credono ancora che sia un CMS da bimbetti…

Come puoi vedere dai nostri archivi, sono diversi anni che seguiamo lo sviluppo WordPress e che ti insegnamo come diventare un professionista in grado di padroneggiare questa piattaforma, ti possiamo assicurare che la piattaforma è sicura, purtroppo non lo è il codice che fin troppo spesso vediamo integrare.

Cercherò quindi di mostrarti come sia possibile tappare uno dei buchi più grandi che abbiamo notato durante lo sviluppo di temi e plugin WordPress, non ti resta altro che continuare a leggere 😉

In molte applicazioni web è necessario fare delle operazioni che ci consentono di modificare i dati presenti nel database e WordPress non è assolutamente da meno! Infatti, come qualsiasi altro CMS, anche la nostra piattaforma preferita ci permette di fare delle operazioni senza neanche dover aprire il terminale; operazioni come cancellare un articolo, aggiornarlo, modificare un menu o aggiungere un utente.

Molto spesso quando si tenta di scrivere del codice sicuro, la prima cosa che facciamo è controllare che l’utente abbia i permessi necessari per svolgere una determinata azione. Ad esempio, se qualcuno vuole cancellare un utente meglio assicurarsi che sia un amministratore altrimenti la mia piattaforma perderà utenti per azioni prese da sconosciuti.

Quindi valutare il ruolo della persona che richiede di svolgere una determinata azione è un passo in avanti nei confronti della sicurazza, ma non è l’unico controllo che possiamo fare!

Molto spesso è comodo poter valutare anche l’intenzione dell’utente, ovvero dobbiamo assicurarci che l’utente voglia eseguire l’azione scelta; ti chiedi perché?

Valuta anche l’Intenzione dei tuoi Utenti

Facciamo un esempio molto semplice, diciamo che voglio creare un link che permetta al mio utente di cancellare un articolo direttamente dal frontend; ovviamente dovrai salvare tutto questo codice all’interno di un plugin 😉

Ebbene una volta sviluppato il codice base vedo che se genero il link http://miosito.it/mio-articolo/?cancella=true sono in grado di far cancellare l’articolo, ovviamente soltanto sé l’utente che clicca quel determinato link ha un ruolo che gli permette di fare questa operazione.

Ma come dicevo prima, questo non è un controllo di sicurezza abbastanza alto perché un utente malevolo potrebbe decidere di mandare una mail all’amministratore del sito dicendo “Ho trovato un refuso a questo articolo.”

Il finto link che ti ho appena inserito potrebbe essere proprio http://miosito.it/mio-articolo/?cancella=true che porterà l’amministratore del sito a ritrovarsi un articolo in meno senza la vera volontà di cancellarlo, bella fregatura non credi?

Ed ecco che arriviamo a presentare l’argomento principale di questo articolo: i Nonce.

Che Cosa è un Nonce?

Con questo termine identifichiamo “number used once”, ovvero una stringa numerica che viene creata una sola volta e che tendenzialmente è usata in crittografia per mettere in sicurezzai dati.

WordPress implementa questa soluzione in modo leggermente diverso dato che non sempre è soltanto una stringa numerica e raramente è unica. Questo succede principalmente perché in WordPress i nonce scadono e possono essere riutilizzati; ovviamente questo non cambia la sicurezza aggiuntiva che i nonce ci permettono di raggiungere.

Grazie a questa caratteristica sarai infatti in grado di generare dei link unici che non soltanto permetteranno al giusto utente con la giusta intenzione di eseguire l’azione posta nel link, ma che scadrà anche dopo un determinato tempo. E questa è una cosa che notiamo molto spesso anche quando WordPress ci invia il link per il reset della nostra password…

Come usare il Nonce con WordPress

Per nostra fortuna il nostro CMS favorito ha pensato a tutto e ci offre diverse funzioni che ci permetteranno di lavorare con i nonce. Ti stai forse chiedendo perché dovremmo lavorare? In fin dei conti è una semplice stringa numerica 🙂

È vero, il nonce è una semplice stringa numerica ma WordPress ci permette di avere a disposizione delle funzioni che prima ci permettono di generare automaticamente questo valore e successivamente di verificarlo.

Dato che questi valori si applicano moltissimo ai moduli che possiamo creare con i nostri plugin, iniziamo prima a vedere come sia possibile farlo con questi elementi e successivamente torneremo a vedere come sia possibile creare un nonce per i nostri link.

Aggiungi un Nonce ai tuoi Moduli

Come dovresti sapere, quando creiamo un modulo con HTML, oltre ai campi visibili che possiamo creare (com ad esempio <input>, <textarea>, <select>…) è possibile creare anche dei campi nascosti il cui unico scopo è quello di passare dei valori.

Se non ti ricordi come sia possibile creare questo elemento, eccolo qua sotto:

Ebbene grazie a WordPress, che ricordiamoci è scritto in PHP 😉 , abbiamo la possibilità di utilizzare una singola funzione che ci permetterà di creare i campi necessari per la gestione dei nonce. Infatti se andiamo ad utilizzare la seguente funzione:

Nel momento in cui WordPress dovrà generare il nostro modulo andrà a creare i seguenti campi:

Per essere completi dovrei dirti che la funzione wp_nonce_field() non accetta soltanto un parametro come abbiamo appena visto, ma dato che che non ti ho ancora spiegato l’utilizzo del parametro passato ho pensato che fosse giusto presentarli tutti assieme:

  • $actionpermette di specificare il nome dell’azione che dovrà essere svolta, è un parametro opzionale ma è consigliato il suo utilizzo;
  • $name il suo valore di default è _wp_nonce ma ci permette di dare il nome al  nonce che verrà inserito all’interno dell’elemento <input> che viene generato. Questa funzionalità è molto utile perché dopo che il nostro modulo viene inviato sarà possibile consultarlo con $_POST[$name] (ricorda sempre meglio il POST rispetto al GET, sopratutto se sono informazioni importanti);
  • $refererprimo valore booleano che possiamo passare alla nostra funzione, ci permette di inserire o meno il campo _wp_http_referer all’interno del nostro modulo. Di default il valore è true e viene inserito il campo;
  • $echo altro valore booleano che ci permette di decidere se mostrare o meno i codici del nostro nonce.

Adesso che abbiamo spiegato i singoli parametri, dato che tutti sono dei parametri opzionali, è giunto il momento di condividere una buona pratica: è sempre bene personalizzare il nome dell’azione questo perché ci permetterà di essere più precisi in fase di verifica; nel nostro esempio abbiamo infatti inserito la funzione get_the_ID() per aumentare l’unicità dell’azione.

Andando a specificare ulteriormente il nome della nostra azione aumentiamo ulteriormente la sicurezza del nostro codice che adesso avrà la possibilità di verificare un’azione molto più precisa. Per poter verificare il tuo nonce a questo punto non dovrai far altro che controllare all’interno della stessa pagina, impostata come action dell’attributo nel tuo &lt;form&gt;, che il nonce sia corretto attraverso l’uso di questo codice:

Praticamente eseguiamo un velocissimo controllo sia della presenza del nostro campo nonce inviato, ricorda che il valore di default è _wp_nonce ma può essere personalizzato come ci pare, che della presenza e correttezza del suo valore.

Se questo controllo va a buon fine possiamo anche proseguire ad eseguire il codice necessario per validare il resto del codice presente nel modulo e fare le operazioni richieste.

Come noti seguiamo i nostri stessi suggerimenti ed utilizziamo il POST ovunque possibile, sopratutto quando si devono passare dei dati che hanno una certa importanza.

Come aggiungere il Nonce ad un link

Scoprire come aggiungere e controllare un nonce inserito all’interno dei nostri moduli è sicuramente un’operazione interessante perché, in fin dei conti, i moduli permettono di gestire qualsiasi CMS ed è molto utile avere delle funzioni che ne facilitano l’utilizzo.

Però nel nostro esempio iniziale abbiamo parlato di link, link che si possono addirittura inviare via email; non ti interessa scoprire come sia possibile mettere in sicurezza anche questi elementi?

Ebbene, in questo contesto WordPress ci viene in aiuto e ha già preparato una funzione che fa al caso nostro. Ovviamente la prima cosa che dobbiamo fare è creare la URL alla quale poter attaccare il nostro nonce. Questo è possibile farlo grazie alla funzione wp_get_shortlink() come mostrato in questo blocco di codice:

Sfruttiamo questa funzione così se il nostro WordPress ha un motore di URL shortner possiamo anche creare delle URL corte altrimenti usa la sua struttura base. Come possiamo notare tutto quello che facciamo è passare il valore ID del nostro articolo arricchito da un parametro passato via GET, cancella, che è impostato a vero.

Ma per creare una URL con nonce è necessario utilizzare la funzione wp_nonce_url() che ci permette di aggiungere sia il nome del nonce da generare che la sua azione. Praticamente la nuova URL sarà simile a questa: http://miosito.it?p=231&amp;_nuovo-nonce=324a87c87s6.

Adesso che abbiamo questi elementi potrai controllare che tutti sia filato liscio attraverso l’uso di questo blocco di codice:

Molto simile al controllo precedente, non facciamo altro che controllare che sia vera la presenza del campo _nuovo-nonce e che il valore passato con questo corrisponda al nonce generato da WordPress. Se tutto fila liscio si continua ad eseguire il codice necessario che come descritto precedentemente e andrà a cancellare l’articolo scelto, altrimenti usciremo da questa funzione e impediremo la cancellazione dell’articolo.

Conclusioni

Eccoci al termine di un altro articolo che ti ha permesso di approfondire le tue conoscenze WordPress, adesso i plugin che potrai creare avranno uno strato ulteriore di sicurezza e come sempre questo significa una maggior professionalità nel prodotto che puoi rilasciare.

Pensare alla sicurezza è una cosa sempre più importante, sopratutto ad oggi che con lo sviluppo delle REST API di WordPress possiamo creare qualcosa di ancora più divertente come le applicazioni mobile!

Abbiamo già discusso ampliamente questi concetti all’interno di un webinar che abbiamo fatto assieme a Eugenio e Daniele dove parliamo di come sia sempre più semplice utilizzare WordPress come un vero e proprio framework!

Le potenzialità che giorno dopo giorno nascono di fronte ai nostri occhi sono veramente incredibili, e sono tante! Ti ricordo che se sei alla ricerca di un posto unico dove mantenere aggiornate le tue conoscenze e seguire dei corsi realizzati appositamente puoi sempre iscriverti a skillsAndMore dove troverai una comunità piena di sviluppatori che vogliono migliorare le proprie conoscenze!

Lascia il tuo Pensiero