Il mixed content si verifica quando una pagina web caricata tramite una connessione HTTPS sicura include risorse (immagini, script, fogli di stile, font, iframe) caricate tramite una connessione HTTP non sicura. Questo è un problema di sicurezza perché le risorse HTTP possono essere intercettate, modificate o sostituite da un attaccante, anche se la pagina principale stessa è crittografata. L'icona del lucchetto nel browser scompare e i visitatori vedono avvisi che minano la loro fiducia nel tuo sito.
Mixed content passivo vs attivo
I browser distinguono tra due categorie di mixed content e trattano ciascuna in modo diverso:
- Mixed content passivo (display): include immagini, audio e video caricati tramite HTTP. Il rischio è inferiore perché queste risorse non possono modificare direttamente il comportamento della pagina. Un attaccante potrebbe scambiare un'immagine (ad esempio mostrando contenuti inappropriati) ma non iniettare codice. I browser più vecchi caricavano il mixed content passivo con un avviso. I browser moderni stanno bloccando sempre più anche questo, sebbene alcuni lo permettano ancora con un indicatore di sicurezza ridotto.
- Mixed content attivo: include script, fogli di stile, iframe, font e XMLHttpRequest caricati tramite HTTP. Il mixed content attivo è molto più pericoloso perché uno script manomesso può rubare credenziali, reindirizzare l'utente o iniettare malware nella pagina. Tutti i browser moderni bloccano il mixed content attivo per impostazione predefinita. La risorsa semplicemente non viene caricata, il che può rompere completamente la funzionalità della pagina.
Come i browser gestiscono il mixed content
Il comportamento dei browser è diventato più severo nel corso degli anni. Ecco cosa succede oggi:
- Chrome: blocca tutto il mixed content attivo. Dalla versione 80, Chrome aggiorna automaticamente anche immagini, audio e video misti a HTTPS. Se la versione HTTPS non esiste, la risorsa viene bloccata.
- Firefox: blocca il mixed content attivo e mostra un'icona di scudo nella barra degli indirizzi. Il mixed content passivo causa un avviso ma può comunque essere caricato in alcuni casi.
- Safari: blocca il mixed content attivo. Il mixed content passivo può essere caricato con un avviso, a seconda della versione.
- Edge: segue lo stesso comportamento basato su Chromium di Chrome.
La tendenza è chiara: i browser si stanno muovendo verso il blocco di tutto il mixed content, sia attivo che passivo. Risolvere i problemi di mixed content non è più facoltativo.
Trovare le fonti di mixed content
Ci sono diversi modi per identificare il mixed content sul tuo sito WordPress:
- Console DevTools del browser: apri Chrome DevTools (F12), vai alla scheda Console e cerca avvisi gialli o errori rossi sul mixed content. Chrome ti dice esattamente quale URL della risorsa sta causando il problema.
- Why No Padlock: uno strumento online gratuito (whynopadlock.com) che scansiona un URL ed elenca tutte le risorse non sicure trovate sulla pagina. Comodo per un controllo rapido senza aprire DevTools.
- Report InspectWP: InspectWP scansiona automaticamente la tua pagina per tutte le risorse caricate tramite HTTP su una pagina HTTPS ed elenca ciascuna di esse. Questo è il modo più veloce per ottenere un quadro completo del tuo intero sito.
- SSL Labs: sebbene sia principalmente un controllo della configurazione SSL/TLS, può anche segnalare problemi di mixed content sulla pagina testata.
Cause comuni di mixed content in WordPress
I problemi di mixed content in WordPress di solito provengono da alcune fonti ricorrenti:
- URL HTTP hardcoded nei contenuti: se hai migrato il tuo sito da HTTP a HTTPS, i tuoi vecchi post e pagine possono ancora contenere URL di immagini e link che iniziano con
http://. Questi erano corretti all'epoca ma sono diventati mixed content dopo la migrazione. - Vecchi asset del tema: alcuni temi più vecchi o temi figlio hanno URL HTTP hardcoded nei loro file CSS, JavaScript o template. Un foglio di stile che carica un'immagine di sfondo da
http://example.com/bg.jpgcrea mixed content. - Risorse dei plugin: i plugin che caricano script o stili esterni tramite HTTP causano mixed content. Questo è particolarmente comune con plugin più vecchi o mantenuti male che non sono stati aggiornati per HTTPS.
- Embed esterni: iframe, video incorporati o widget di servizi esterni che utilizzano URL HTTP. Se il servizio esterno supporta HTTPS (la maggior parte lo fa al giorno d'oggi), passare l'URL a HTTPS risolve il problema.
- Configurazione CDN: se il tuo CDN non è configurato per servire asset tramite HTTPS, ogni file CSS, JS e immagine consegnato tramite il CDN diventa mixed content.
Risolvere il mixed content in WordPress
La soluzione dipende dalla fonte del problema. Ecco le correzioni più comuni:
- Sostituzione URL nel database: per gli URL HTTP hardcoded nel contenuto dei post, usa uno strumento di ricerca e sostituzione per aggiornare tutte le occorrenze di
http://tuodominio.comahttps://tuodominio.comnel database. Il plugin Better Search Replace è ampiamente utilizzato per questo. Ti permette di rivedere le modifiche prima di applicarle e funziona su tutte le tabelle del database. Esegui sempre un backup del database prima di eseguire una ricerca e sostituzione. - SSL Insecure Content Fixer: questo plugin WordPress risolve automaticamente gli URL non sicuri al volo. Riscrive gli URL HTTP in HTTPS nell'output della pagina senza modificare il database. È una buona soluzione temporanea mentre affronti le cause principali, ma aggiunge un piccolo overhead di prestazioni perché elabora ogni caricamento di pagina.
- Really Simple SSL: un altro plugin popolare che gestisce la transizione da HTTP a HTTPS. Risolve il mixed content filtrando l'output della pagina, imposta i redirect e aggiorna le impostazioni dell'URL del sito WordPress.
- Correzioni manuali di tema e plugin: se il mixed content proviene da un file di tema o plugin, modifica il codice sorgente per sostituire
http://conhttps://o, meglio ancora, usa URL relativi al protocollo (//example.com/file.js) o la funzione WordPressesc_url()per generare URL dinamicamente.
Sostituzione URL nel database in dettaglio
Il modo più completo per risolvere il mixed content nel vecchio contenuto dei post è una ricerca e sostituzione nel database. Ecco il processo:
- Esegui il backup del tuo database. Questo non è facoltativo; una ricerca e sostituzione errata può rompere l'intero sito.
- Installa e attiva il plugin Better Search Replace.
- Cerca
http://tuodominio.come sostituisci conhttps://tuodominio.com. - Seleziona tutte le tabelle del database (in particolare
wp_posts,wp_postmetaewp_options). - Esegui prima una prova per vedere quante sostituzioni avverrebbero.
- Se i numeri sembrano giusti, esegui la sostituzione effettiva.
Per gli utenti WP-CLI, il comando wp search-replace 'http://tuodominio.com' 'https://tuodominio.com' --all-tables fa la stessa cosa dalla riga di comando. WP-CLI gestisce correttamente i dati serializzati nel database, il che è cruciale per le opzioni e le impostazioni dei widget.
Redirect HTTPS tramite .htaccess
Dopo aver risolto il mixed content, assicurati che tutte le richieste HTTP al tuo sito vengano reindirizzate a HTTPS. Questo impedisce a visitatori e motori di ricerca di accedere alla versione HTTP. Sui server Apache, aggiungi queste righe al tuo file .htaccess:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]Sui server Nginx, aggiungi questo al tuo blocco server:
server {
listen 80;
server_name tuodominio.com www.tuodominio.com;
return 301 https://$server_name$request_uri;
}Questo redirect non risolve il mixed content da solo, ma garantisce che nessuno visiti accidentalmente la versione HTTP del tuo sito. Combinato con la sostituzione dell'URL nel database e le correzioni dei plugin, completa la migrazione HTTPS.
Cosa controlla InspectWP
InspectWP scansiona la tua pagina per tutte le risorse caricate tramite HTTP su una pagina HTTPS ed elenca ciascuna di esse, incluso il tipo di risorsa e l'URL completo. Questo ti dà una checklist chiara di esattamente ciò che deve essere risolto. Le pagine senza problemi di mixed content mostrano un risultato pulito, confermando che la tua configurazione HTTPS funziona correttamente.