L'unico modo sicuro per farlo
Tutte le altre risposte in questa pagina hanno implicazioni per la sicurezza di cui devi essere consapevole.
L'unico metodo sicuro garantito per recuperare il dominio corrente
è 𝓼𝓽𝓸𝓻𝓮 𝓲𝓽 𝓲𝓷 𝓪 𝓼𝓮𝓬𝓾𝓻𝓮 𝓵𝓸𝓬𝓪𝓽𝓲𝓸𝓷 𝔂𝓸𝓾𝓻𝓼𝓮𝓵𝓯.
La maggior parte dei framework si occupa della memorizzazione del dominio per te, quindi ti consigliamo di consultare la documentazione per il tuo framework particolare. Se non si utilizza un framework, prendere in considerazione la memorizzazione del dominio in uno dei seguenti luoghi:
+ ------------------------------------------------- --- + ----------------------------------- +
| Metodi sicuri per l'archiviazione del dominio | Usato da |
+ ------------------------------------------------- --- + ----------------------------------- +
| Un file di configurazione | Joomla, Drupal / Symfony |
| Il database | WordPress |
| Una variabile ambientale | Laravel |
| Un registro dei servizi | Kubernetes DNS |
+ ------------------------------------------------- --- + ----------------------------------- +
Puoi usare quanto segue ... ma non sono sicuri
Gli hacker possono fare in modo che queste variabili producano il dominio che desiderano. Ciò può comportare avvelenamenti da cache e attacchi di phishing appena percettibili.
$_SERVER['HTTP_HOST']
Ciò ottiene il dominio dalle intestazioni della richiesta che possono essere manipolate dagli hacker . Lo stesso con:
$_SERVER['SERVER_NAME']
Questo può essere migliorato se l'impostazione Apache usecanonicalname è disattivata; nel qual caso $_SERVER['SERVER_NAME']non sarà più possibile compilare con valori arbitrari e sarà sicuro. Questo è, tuttavia, non predefinito e non comune a una configurazione.
In sistemi popolari
Di seguito è riportato come ottenere il dominio corrente nei seguenti framework / sistemi:
WordPress
$urlparts = parse_url(home_url());
$domain = $urlparts['host'];
Se stai costruendo un URL in WordPress, usa semplicemente home_url o site_url o una qualsiasi delle altre funzioni URL .
laravel
request()->getHost()
La request()->getHostfunzione è ereditata da Symfony ed è stata protetta da quando il CVE-2013-4752 del 2013 è stato patchato.
Drupal
Il programma di installazione non si occupa ancora di renderlo sicuro ( numero 2404259 ). Ma in Drupal 8 è disponibile la documentazione che puoi seguire in Impostazioni host attendibili per proteggere l'installazione di Drupal dopo la quale è possibile utilizzare quanto segue:
\Drupal::request()->getHost();
Altri quadri
Sentiti libero di modificare questa risposta per includere come ottenere il dominio corrente nel tuo framework preferito. Nel fare ciò, si prega di includere un collegamento al codice sorgente pertinente o qualsiasi altra cosa che possa aiutarmi a verificare che il framework stia facendo le cose in modo sicuro.
appendice
Esempi di sfruttamento:
L'avvelenamento da cache può verificarsi se una botnet richiede continuamente una pagina utilizzando l'intestazione host errata. L'HTML risultante includerà quindi collegamenti al sito Web degli aggressori in cui possono phishing i tuoi utenti. Inizialmente i collegamenti dannosi verranno restituiti solo all'hacker, ma se l'hacker fa abbastanza richieste, la versione dannosa della pagina finirà nella cache dove verrà distribuita ad altri utenti.
Un attacco di phishing può verificarsi se si memorizzano collegamenti nel database in base all'intestazione degli host. Ad esempio, supponiamo che memorizzi l'URL assoluto nei profili di un utente su un forum. Usando l'intestazione sbagliata, un hacker potrebbe ottenere a chiunque faccia clic sul link del proprio profilo di essere inviato a un sito di phishing.
L'avvelenamento da reimpostazione della password può verificarsi se un hacker utilizza un'intestazione host dannosa durante la compilazione del modulo di reimpostazione della password per un altro utente. Quell'utente riceverà quindi un'email contenente un link di reimpostazione della password che conduce a un sito di phishing.
Ecco alcuni esempi più dannosi
Avvertenze e note aggiuntive:
- Quando il nome utente viene disattivato,
$_SERVER['SERVER_NAME']viene popolato comunque con la stessa intestazione $_SERVER['HTTP_HOST'](più la porta). Questa è la configurazione predefinita di Apache. Se tu o devops lo accendi, allora stai bene - ish - ma vuoi davvero fare affidamento su una squadra separata, o te stesso tre anni in futuro, per mantenere quella che sembrerebbe essere una configurazione minore in un non -valore predefinito? Anche se questo rende le cose sicure, vorrei evitare di fare affidamento su questa configurazione.
- Redhat, tuttavia, attiva in modo predefinito l'utente us [ fonte ].
- Se serverAlias viene utilizzato nella voce host virtuali e viene richiesto il dominio con alias,
$_SERVER['SERVER_NAME']non verrà restituito il dominio corrente, ma verrà restituito il valore della direttiva serverName.
- Se il serverName non può essere risolto, al suo posto viene utilizzato il comando hostname del sistema operativo [origine] .
- Se l'intestazione host viene lasciata fuori, il server si comporterà come se usecanonical fosse su [source] .
- Infine, ho appena provato a sfruttarlo sul mio server locale e non sono riuscito a falsificare l'intestazione degli host. Non sono sicuro se ci sia stato un aggiornamento di Apache che ha risolto questo problema o se stavo solo facendo qualcosa di sbagliato. Indipendentemente da ciò, questa intestazione sarebbe comunque sfruttabile in ambienti in cui gli host virtuali non vengono utilizzati.
Little Rant:
Questa domanda ha ricevuto centinaia di migliaia di visualizzazioni senza una sola menzione dei problemi di sicurezza a portata di mano! Non dovrebbe essere così, ma solo perché una risposta Stack Overflow è popolare, ciò non significa che sia sicura.