Permissions-Policy è un response header HTTP che dà ai proprietari di siti un controllo preciso su quali funzionalità del browser e API possono essere usate sulle loro pagine, e in modo cruciale: a quali funzionalità i contenuti incorporati di terze parti hanno accesso. Ti sei mai chiesto come una pubblicità all'interno di un iframe possa silenziosamente richiedere l'accesso alla camera o al microfono del tuo visitatore, allora Permissions-Policy è il meccanismo che dovrebbe prevenire proprio quello.
L'header è stato originariamente introdotto con il nome Feature-Policy. I browser hanno iniziato a supportarlo intorno al 2018, ma la specifica ha subito modifiche importanti, e l'header è stato infine rinominato in Permissions-Policy con una nuova sintassi. Oggi, la maggior parte dei browser moderni riconosce l'header Permissions-Policy, anche se alcuni browser più vecchi potrebbero comprendere solo il vecchio formato Feature-Policy. Per la massima compatibilità puoi inviare entrambi gli header, ma Permissions-Policy è quello su cui dovresti concentrarti in prospettiva.
Quali funzionalità del browser possono essere controllate
La lista delle funzionalità che puoi limitare tramite Permissions-Policy è sorprendentemente lunga e continua a crescere man mano che i browser aggiungono nuove capacità. Ecco le più rilevanti per i proprietari di siti WordPress:
camera: controlla l'accesso alla fotocamera del dispositivo. Rilevante se gestisci un sito di membership con upload di video o un plugin che offre foto profilo basate su webcam.microphone: controlla l'accesso alla registrazione audio. Plugin di ricerca vocale, strumenti di registrazione podcast e widget di chat live a volte lo richiedono.geolocation: controlla l'accesso alla posizione GPS o di rete del visitatore. Localizzatori di filiali, widget di mappe e contenuti basati sulla posizione possono richiederlo.payment: controlla la Payment Request API, che consente ai siti web di attivare dialoghi di pagamento nativi del browser. WooCommerce e altri plugin e-commerce possono usarlo per un processo di checkout semplificato.fullscreen: controlla se i contenuti incorporati possono richiedere la modalità a schermo intero. Lettori video, lightbox per gallerie e plugin di presentazione lo necessitano tipicamente.autoplay: controlla se gli elementi multimediali possono essere riprodotti automaticamente. Questo influisce su video di background nelle intestazioni, slider con riproduzione automatica e lettori YouTube o Vimeo incorporati.display-capture: controlla le capacità di condivisione dello schermo. Particolarmente rilevante per strumenti di conferenza o supporto incorporati nel tuo sito.usb: controlla la WebUSB API. Raramente necessaria su siti WordPress tipici, ma a volte usata da plugin di integrazione hardware specializzati.bluetooth: controlla l'accesso Web Bluetooth. Simile a USB; funzionalità di nicchia, ma utile da limitare di default.interest-cohort: era usata per rinunciare alla proposta di tracciamento FLoC di Google. Sebbene FLoC sia stato sostituito dalla Topics API, molti siti inviano ancora questa direttiva.
Come funziona la sintassi
L'header Permissions-Policy usa una sintassi semplice. Ogni funzionalità è seguita da una lista di permessi tra parentesi. Parentesi vuote significano che la funzionalità è completamente disabilitata per tutti, inclusa la tua pagina:
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()Se vuoi consentire una funzionalità per la tua origin ma bloccarla per tutti i contenuti incorporati di terze parti, usa la parola chiave self:
Permissions-Policy: camera=(self), geolocation=(self "https://maps.example.com")In questo esempio, le tue pagine possono accedere alla fotocamera, e la geolocalizzazione è disponibile sia per la tua origin sia per un provider di mappe fidato. Ogni altra origin incorporata viene bloccata dall'uso di tali funzionalità. Puoi anche usare * per consentire tutte le origin, ma questo vanifica l'intero scopo dell'header.
Come gli iframe di terze parti abusano dei permessi del browser
Il principale modello di minaccia dietro Permissions-Policy è l'iframe incorporato. Quando includi una rete pubblicitaria, un widget social, uno strumento di chat o qualsiasi altro embed di terze parti sul tuo sito WordPress, quell'embed gira in un iframe con il suo contesto di esecuzione. Senza l'header Permissions-Policy, il browser tratta quell'iframe per quanto riguarda l'accesso alle funzionalità quasi come una pagina first-party.
Questo significa che una pubblicità malamente codificata o decisamente malevola può chiamare navigator.mediaDevices.getUserMedia() per richiedere l'accesso a camera o microfono. Il browser mostra al visitatore una richiesta di autorizzazione, ma quella richiesta indica solo che il sito sta chiedendo l'accesso. La maggior parte degli utenti non si rende conto che la richiesta proviene da una pubblicità incorporata, piuttosto che dal sito web che sta visitando. Se cliccano "Consenti", la pubblicità ha un feed video o audio live.
L'abuso della geolocalizzazione è ancora più sottile. Alcune reti pubblicitarie sono state colte a richiedere dati di posizione per costruire profili utente più dettagliati. L'abuso della Payment API è meno comune ma potenzialmente più pericoloso, perché può attivare dialoghi di pagamento ingannevoli. Con una Permissions-Policy rigorosa, blocchi tutti questi vettori di attacco a livello di browser, indipendentemente dal JavaScript che l'embed tenta di eseguire.
La relazione con il vecchio header Feature-Policy
Se hai incontrato riferimenti a Feature-Policy e ti chiedi se è la stessa cosa: sì, in sostanza sì. Feature-Policy era il nome originale e usava una sintassi leggermente diversa. Invece di camera=(self), il vecchio formato era camera 'self'. L'header Feature-Policy è stato supportato da Chrome, Firefox e altri browser a partire dal 2018 circa.
Il W3C ha infine ridisegnato la specifica con una sintassi più pulita e l'ha rinominata in Permissions-Policy. Chrome è passato al nuovo header nella versione 88 (gennaio 2021). Firefox ha seguito più tardi. Al momento, Feature-Policy è considerato deprecato. La maggior parte degli scanner di sicurezza e degli strumenti (incluso InspectWP) cerca specificamente l'header Permissions-Policy. Se il tuo server invia ancora il vecchio header Feature-Policy, di solito funziona ancora nei browser che lo supportano, ma pianifica una migrazione al nuovo formato.
Considerazioni specifiche per WordPress
I siti WordPress sono particolarmente influenzati da Permissions-Policy a causa di come funziona l'ecosistema dei plugin. Un sito WordPress tipico ha da 15 a 30 plugin attivi, e molti di essi iniettano iframe o caricano script di terze parti. Ecco scenari comuni in cui Permissions-Policy è importante:
- Plugin di moduli di contatto con campi di upload file che offrono registrazione con fotocamera su dispositivi mobili.
- Pagine di checkout WooCommerce che si integrano con processori di pagamento tramite iframe.
- Embed di Google Maps che richiedono la geolocalizzazione per mostrare la posizione dell'utente.
- Plugin di videoconferenza (per corsi online o supporto) che richiedono accesso a camera e microfono.
- Plugin di gestione pubblicità che incorporano iframe di reti pubblicitarie nelle tue pagine.
L'approccio corretto è iniziare con una policy restrittiva che disabilita tutto e poi abilitare selettivamente le funzionalità di cui il tuo sito ha effettivamente bisogno. Così, anche se un plugin carica un iframe di terze parti inaspettato, il browser blocca l'accesso a funzionalità sensibili.
Come impostare l'header Permissions-Policy in WordPress
Puoi aggiungere l'header tramite la configurazione del web server o tramite un plugin WordPress. Per Apache, aggiungi una riga al tuo .htaccess:
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=(), usb=(), bluetooth=()"Per Nginx, l'equivalente va nel tuo blocco server:
add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=(), usb=(), bluetooth=()" always;Plugin di sicurezza come HTTP Headers, Really Simple Security o Perfmatters offrono anche controlli basati su UI per impostare l'header Permissions-Policy senza dover toccare i file di configurazione del server.
Cosa controlla InspectWP
InspectWP analizza se il tuo sito WordPress invia un header Permissions-Policy nelle sue risposte HTTP. Se l'header manca, il report lo segnala come problema di sicurezza, perché i contenuti incorporati di terze parti (pubblicità, widget, iframe) possono accedere senza alcuna restrizione a funzionalità sensibili del browser come camera, microfono o geolocalizzazione. Il report mostra anche il valore grezzo dell'header, in modo che tu possa verificare quali funzionalità sono attualmente limitate.