Quindi stai memorizzando le password del database e i segreti crittografici in un file all'interno della web root, probabilmente perché il web hosting di fascia bassa non ha altri archivi per questi segreti. Immettendo il nome di questo file come percorso in una richiesta GET
HTTP recupererà il suo contenuto. Anche se fornisci "nessun esploratore di file basato sul web", un utente malintenzionato potrebbe comunque finire a indovinare correttamente il nome di questo file chiave segreto a meno che il suo nome non sia crittograficamente casuale. O qualcuno che conosce il nome del file potrebbe trapelare il nome a un utente malintenzionato.
Il file .htaccess
in Apache HTTP Server, o file analoghi in altri server web, è progettato per impedire l'accesso diretto a un file attraverso il web anche se un client conosce il suo nome. Questo è utile in due situazioni:
- Supponiamo di archiviare segreti in un file JSON caricato dallo script PHP con
file_get_contents()
all'avvio. Il .htaccess
bloccherebbe un utente che digita l'URL di questo file JSON.
- Supponiamo di archiviare segreti in uno script PHP contenente assegnazioni a variabili globali, che il tuo script PHP include con
require_once
all'avvio. Ad esempio, LocalSettings.php
di MediaWiki utilizza questo approccio. Normalmente, uno script con impostazioni variabili non riuscirebbe a produrre alcun output. Ma ho visto situazioni occasionali in cui mod_php o il gestore CGI non riesce a caricare accidentalmente, il che fa sì che Apache invece serva i file PHP come testo normale, inclusi i tuoi segreti. Il .htaccess
bloccherebbe un utente che digita l'URL di questo file PHP.
Ma fai attenzione: .htaccess
non impedisce l'accesso attraverso uno script, ad esempio se uno script accetta un nome file come argomento e restituisce il contenuto di quel file. Assicurati quindi che tutti gli script che leggono i file con nomi di variabili, come gli script di pubblicazione delle immagini, disinfettino i loro percorsi canonicalizzandoli ( realpath()
e amici) e quindi limitandoli a una directory specifica.