Mettere in sicurezza PHP

php 8
PHP 8

Come successo per Apache, anche PHP necessita di essere messo in sicurezza, al fine di evitare spiacevoli inconvenienti. I file deputato alla configurazione ed al controllo di diversi aspetti del comportamento dell’interprete PHP è il file php.ini, esso è un file di testo contenti delle direttive (case sensitive). Vediamo come mettere in sicurezza PHP, la prima cosa da fare è aprire il file php.ini che è possibile trovare in:

   /etc/php/x.x/apache2/php.ini

Dove le x indicano la versione di PHP che stai utilizzando.

Prime impostazioni

Le prime direttive a cui devi prestare attenzione sono:

allow_url_include: Consente l’inclusione automatica di file mediante URL, che permettono l’apertura di un indirizzo in automatico o l’inclusione di URL nel codice sorgente, tale direttiva deve essere posta ad off

allow_url_include = Off

Imposta open_basedir per limitare l’accesso ai file solo nelle directory specificate. Con open_basedir puoi definire le posizioni e i percorsi nei quali uno script PHP è autorizzato ad accedere ai file.

Tramite questa impostazione qualsiasi script che cercasse di accedere a un file situato al di fuori dell’elenco dei percorsi consentiti, verrebbe bloccato e la cosa sarebbe segnalata nei log d’error.

Imposta la tua open_basedir=/var/www/html , naturalmente potrai includere anche altri path, separandoli da ;

Funzioni non necessaria

Disabilita le funzioni non necessarie con la direttiva disable_functions, Alcune funzioni in ambito web non sono necessarie ed anzi dannose, quindi meglio non utilizzarle, eccoti un esempio:

disable_functions = exec, passthru, shell_exec, system, proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_source, php_uname, getmyuid, getmypid, leak, listen, diskfreespace

Visualizzazione degli errori

In fase di implementazione e manutenzione, visualizzare gli errori è sicuramente un buon metodo, per verificare e correggere la presenza di errori, ma in fase di produzione, mostrare gli errori potrebbe rilevarsi controproducente, molti errori possono essere sfruttati per eseguire degli attacchi al server, ti consiglio quindi di disabilitare la visualizzazione degli errori, in modo da non dare punti di riferimento ad eventuali attaccanti che potrebbero utilizzare delle tecniche specifiche, imposta display_errors = Off

Apertura file remoti

La direttiva allow_url_fopen in PHP controlla se è permesso aprire file remoti usando funzioni come file_get_contents() e fopen() specificando un URL. L’impostazione predefinita è di solito abilitata, ma ciò può rappresentare un rischio per la sicurezza se non gestita correttamente. Consentire l’apertura di file remoti potrebbe consentire a un attaccante di eseguire attacchi come inclusione di file remoti (Remote File Inclusion) o altre vulnerabilità.

Disabilita allow_url_fopen se non necessario: Se il tuo codice non ha bisogno di aprire file remoti tramite URL, è consigliabile disabilitare questa opzione impostandola su Off

allow_url_fopen = Off

Se hai necessità di aprire file remoti tramite URL, verifica se esistono alternative sicure, ad esempio utilizzando librerie alternative, come cURL, che fornisce maggiori opzioni di controllo e sicurezza rispetto a allow_url_fopen, e prendi in considerazione la  validazione dell’input, assicurandoti che qualsiasi input che venga utilizzato per costruire l’URL sia attentamente validato e filtrato per prevenire potenziali attacchi. Altro accorgimento da prendere se sei costretto ad utilizzare allow_rul_fopen, è quello di limitare l’accesso solo a risorse affidabili e conosciute. Non aprire URL forniti dall’utente o provenienti da fonti non verificate.

Gestione degli uploads

Se la tua applicazioni server side non prevede la necessità di eseguire l’upload di alcun tipo di file occorre disabilitare la direttiva file_uploads: file_uploads = Off

Se invece sei costretto ad abilitarla meglio settare accuratamente le seguenti impostazioni.

Definisci la dimensione massima dei dati, che possono essere inviati tramite una richiesta HTTP POST. Questo valore include sia i dati del modulo, che i dati caricati come parte di un form. La dimensione è espressa in byte, a meno che non venga specificato un suffisso come “K” per kilobyte o “M” per megabyte

post_max_size = 8M

Aumentare eccessivamente il limite di dimensione potrebbe esporre il server a rischi di sicurezza, come attacchi di sovraccarico o caricamento di file dannosi. Trova un equilibrio tra le esigenze dell’applicazione e la sicurezza del server.

Definiamo la dimensione massima consentita per un singolo file che può essere caricato sul server tramite un modulo di caricamento (ad esempio, un modulo di caricamento immagini). Questo valore è espresso in byte, a meno che non venga specificato un suffisso come “K” per kilobyte o “M” per megabyte, e lo si setta tramite la direttiva upload_max_filesize.

upload_max_filesize = 2M

Il valore di upload_max_filesize deve essere coerente con quello di post_max_size, ad esempio avendo settato post_max_size ad 8M, un valore pari a 12M per upload_max_file è del tutto incoerente.

Gestione dei tempi

La direttiva max_execution_time in PHP definisce il tempo massimo (in secondi) che uno script può essere in esecuzione prima che venga interrotto dal server. Questo è utile, per evitare script che potrebbero causare un carico eccessivo sul server o causare rallentamenti nell’esecuzione di altri script.

Ad esempio, se imposti max_execution_time = 30, significa che uno script PHP può essere in esecuzione per massimo 30 secondi prima di essere interrotto. Se uno script richiede più tempo per completare l’esecuzione, verrà interrotto dalla configurazione di timeout.

  • Tempo di esecuzione massimo di ogni script, in secondi

max_execution_time = 30

Altra direttiva da considerare è max_input_time, in PHP specifica il tempo massimo (in secondi) che uno script può trascorrere per elaborare i dati in ingresso, come parametri di query o dati di form, prima di iniziare effettivamente l’esecuzione dello script. Questo valore è importante per evitare che un input dannoso o eccessivamente grande causi ritardi nell’esecuzione degli script.

Se, ad esempio, imposti max_input_time = 60, significa che PHP impiegherà al massimo 60 secondi per elaborare l’input prima che l’esecuzione dello script inizi.

  • Quantità massima di tempo ogni script può spendere richiesta data di analisi

max_input_time = 60

Gestione della memoria

La direttiva memory_limit in PHP definisce la quantità massima di memoria che uno script può utilizzare durante l’esecuzione. Questo valore è espresso in byte, a meno che non venga specificato un suffisso come “K” per kilobyte, “M” per megabyte o “G” per gigabyte.

Ad esempio, memory_limit = 128M indica che uno script PHP può utilizzare al massimo 128 megabyte di memoria.

Un valore troppo basso potrebbe causare errori di esaurimento della memoria, mentre un valore troppo alto potrebbe influire sulle prestazioni del server. Trova un equilibrio tra la disponibilità di memoria e l’efficienza, il mio consiglio è quello di iniziare con il valore di default è modificarlo di volta in volta sino a trovare il giusto equilibrio.

  • Quantità massima di memoria uno script può consumare

memory_limit = 128M

Gestione dei cookie

Con session.cookie_httponly in PHP puoi specificare se i cookie di sessione devono essere accessibili solo tramite il protocollo HTTP e non tramite JavaScript. L’obiettivo principale di questa impostazione è aumentare la sicurezza delle sessioni, impedendo l’accesso ai cookie da parte di script malevoli eseguiti in un contesto di pagina Web.

Quando session.cookie_httponly è abilitato, il cookie di sessione verrà impostato con l’attributo HttpOnly, che significa che il cookie non sarà accessibile tramite JavaScript, limitando così la potenziale esposizione a attacchi come Cross-Site Scripting (XSS). Gli script lato client, incluso JavaScript, non saranno in grado di accedere al cookie della sessione.

session.cookie_httponly = 1

Conclusione

Ricorda che tutte le modifiche avranno effetto solo dopo il riavvio di apache, quindi digita:

systemctl restart apache2.service

Se vuoi approfondire il commando systemctl leggi l’articolo ad esso dedicato.

Ritorna all’indice creare un server LAMP.