C'è un problema con l'emissione di un'intestazione HSTS in PHP?

8

Voglio provare una politica HSTS sul mio blog senza abilitarlo inizialmente sul sito. Siccome una politica HSTS è solo un'intestazione di risposta HTTP, ci sarebbe qualche problema con l'invio dell'intestazione in PHP in questo modo:

header("strict-transport-security: max-age=600");

Il sito reindirizzerà qualsiasi richiesta http: // a https: // e mi rendo conto che questo probabilmente porterà all'header HSTS inviato su http: // che non dovrebbe. Tuttavia, per essere conforme allo standard HSTS, un interprete dovrebbe ignorare la politica HSTS fornita tramite http: // poiché potrebbe essere stata iniettata maliziosamente. Dato che questo è solo a scopo di test, non sono eccessivamente preoccupato comunque.

Questo mi permetterà di pubblicare l'intestazione solo su una pagina specifica e di esporla solo a me stesso senza influire su nessun altro utente. Potrei anche avere un'altra pagina per disabilitare la politica HSTS in questo modo:

header("strict-transport-security: max-age=0");

Se questo dovesse rivelarsi positivo, ci sono problemi che possono essere visti con l'emissione della politica HSTS in questo modo? Forse gli utenti su hosting condiviso o senza accesso / conoscenza per configurare un'intestazione di risposta potrebbero ancora implementare HSTS in questo modo.

    
posta Scott Helme 30.09.2013 - 23:18
fonte

2 risposte

10

L'HSTS è abilitato restituendo l'intestazione strict-transport-security da una risposta HTTPS: al browser non interessa se questo è impostato in PHP, dal server o da un servizio di bilanciamento del carico, a condizione che riceva un'intestazione valida su HTTPS allora HSTS sarà abilitato.

Dovresti essere OK, solo restituendo questa intestazione da una singola pagina per il test. RFC 6797 afferma

If a UA receives HTTP responses from a Known HSTS Host over a secure channel but the responses are missing the STS header field, the UA MUST continue to treat the host as a Known HSTS Host until the max-age value for the knowledge of that Known HSTS Host is reached.

quindi le altre tue risposte senza l'intestazione non annulleranno l'HSTS per il tuo sito.

L'impostazione di max-age=0 è anche il modo corretto di cancellare l'HSTS per il tuo sito (per agente utente ricevente). L'unica cosa che ho notato che non è standard il modo in cui stai facendo è che stai inviando l'intestazione anche su HTTP - anche se questo sarebbe ignorato da un agente utente conforme non è valido quindi mi assicurerei di trasmetterlo solo quando la connessione è sicura (meglio attenersi agli standard il più vicino possibile trovo).

Puoi controllare se emettere l'intestazione con il seguente codice che controlla che la pagina sia stata acceduta tramite HTTPS :

<?php
function isSSL(){

    if($_SERVER['https'] == 1) /* Apache */ {
        return TRUE;
    } elseif ($_SERVER['https'] == 'on') /* IIS */ {
        return TRUE;
    } elseif ($_SERVER['SERVER_PORT'] == 443) /* others */ {
        return TRUE;
    } else {
        return FALSE; /* just using http */
    }

}
?>
    
risposta data 30.11.2013 - 10:03
fonte
0

L'intestazione HSTS è per un dominio (o sottodomini, se fornito con la direttiva includeSubDomain ). Tuttavia, un valore di 0 in max-age causerà la cessazione dell'utilizzo di HSTS da parte dell'utente. (Fare riferimento a sezione 6.1.1 della bozza specifica ).

    
risposta data 01.10.2013 - 09:02
fonte

Leggi altre domande sui tag