Per attivare shell_exec PHP devi poter modificare la configurazione PHP a livello di sistema. Su un hosting condiviso la funzione può essere limitata dal provider e il singolo account non può riattivarla da cPanel, da .htaccess, da .user.ini o con ini_set(). Su un VPS o server dedicato la configurazione può essere valutata da chi possiede i privilegi amministrativi.
Risposta rapida: sui server condivisi Xlogic non è possibile attivare autonomamente shell_exec() quando la funzione è disabilitata a livello server. Prima di cambiare servizio, verifica perché il software la richiede: spesso esiste un’API, una libreria PHP, un’attività cron o un metodo alternativo più sicuro. Se l’esecuzione di comandi è indispensabile, serve un ambiente amministrabile e correttamente isolato, come un VPS SSD o un server dedicato.
Importante: abilitare shell_exec() non concede automaticamente privilegi di amministratore. I comandi vengono eseguiti con l’utente, i permessi, l’ambiente e i limiti del processo PHP. La funzione amplia però la superficie di attacco: non deve mai ricevere comandi, percorsi, nomi di file o opzioni costruiti direttamente con dati forniti dagli utenti.
Che cos’è shell_exec in PHP
shell_exec() è una funzione PHP che passa un comando alla shell del sistema operativo e restituisce l’output completo come stringa. La documentazione ufficiale PHP di shell_exec indica che il valore restituito può essere una stringa, false oppure null. Un risultato null non distingue con certezza un errore da un comando che non produce output.
La funzione non è necessaria per il normale funzionamento di PHP, WordPress, PrestaShop o Joomla. Viene richiesta da applicazioni che devono avviare un programma esterno, convertire file, elaborare video o immagini, creare archivi con un binario di sistema, interrogare strumenti locali oppure coordinare processi non disponibili come librerie PHP.
Usare una shell significa introdurre un secondo interprete oltre a PHP. Caratteri come spazi, virgolette, reindirizzamenti e operatori hanno un significato per il sistema operativo. Se un’applicazione compone il comando con input non attendibile può creare una vulnerabilità di command injection, con conseguenze che dipendono dai permessi assegnati al processo web.
È possibile attivare shell_exec su un hosting condiviso?
No, non dal singolo account quando il blocco è definito nella configurazione del server. La direttiva PHP disable_functions è classificata come INI_SYSTEM. La documentazione ufficiale di disable_functions specifica che deve essere impostata nel file di configurazione PHP e non può essere modificata durante l’esecuzione dello script.
Per questo motivo non è sufficiente:
- aggiungere
ini_set('disable_functions', '')al codice; - inserire la direttiva in
.htaccesso.user.ini; - modificare un valore dal MultiPHP INI Editor quando il server non consente l’override;
- cambiare versione PHP sperando che la politica di sicurezza scompaia;
- rinominare la funzione o usare l’operatore con i backtick;
- cercare funzioni equivalenti disabilitate per aggirare il limite.
Su un’infrastruttura condivisa una modifica riguarda il modello di sicurezza e l’isolamento di molti account. L’eventuale indisponibilità della funzione non è quindi un errore di cPanel né una limitazione correggibile dal proprietario del dominio. Anche l’operatore con i backtick usa lo stesso meccanismo di shell_exec() e non rappresenta un’alternativa.
Dove può essere configurata la funzione
| Ambiente | Chi gestisce PHP | Possibilità di modifica |
|---|---|---|
| Hosting condiviso | Provider | Il singolo account non può rimuovere una restrizione applicata a livello server. |
| VPS SSD Unmanaged | Cliente con accesso root | L’amministratore può valutare configurazione, isolamento, aggiornamenti e riavvio del servizio PHP. |
| VPS SSD Full Managed | Xlogic secondo il servizio acquistato | La richiesta deve essere valutata tecnicamente; la gestione non implica l’attivazione automatica di ogni funzione. |
| Server dedicato Unmanaged | Cliente con accesso amministrativo | È possibile definire la politica PHP assumendosi gestione e sicurezza dell’intero sistema. |
| Server dedicato Full Managed | Xlogic secondo configurazione e perimetro | Compatibilità e rischio vengono valutati prima di modificare il profilo PHP. |
I VPS SSD Xlogic sono disponibili in modalità Unmanaged o Full Managed e includono accesso root nelle configurazioni indicate. Anche i server dedicati Xlogic possono fornire un ambiente amministrabile. La scelta non deve basarsi soltanto su shell_exec(): considera competenze sistemistiche, manutenzione, monitoraggio, backup, aggiornamenti e responsabilità operative.
Come verificare se shell_exec è disponibile
Il controllo più prudente non esegue alcun comando. Crea temporaneamente un file PHP protetto o esegui il test in un ambiente non pubblico, quindi rimuovilo appena terminata la verifica:
<?php
$available = function_exists('shell_exec');
$disabled = array_filter(array_map(
'trim',
explode(',', (string) ini_get('disable_functions'))
));
echo $available ? 'shell_exec definita' : 'shell_exec non definita';
echo in_array('shell_exec', $disabled, true)
? ' e presente in disable_functions'
: ' e non elencata in disable_functions';
function_exists() controlla se una funzione è definita. A partire da PHP 8, una funzione interna disabilitata tramite disable_functions viene rimossa dalla lista delle funzioni definite; nelle versioni precedenti poteva risultare definita pur non essendo invocabile. Il controllo combinato aiuta quindi a interpretare versioni PHP e configurazioni differenti senza avviare programmi esterni.
Non pubblicare una pagina completa con phpinfo(): può esporre percorsi, moduli, variabili e dettagli utili a un attaccante. Se devi verificare la configurazione, limita l’output ai due valori necessari, proteggi l’accesso e cancella il file dopo il test. Non incollare in un ticket l’intero output di phpinfo() senza richiesta.
Perché il test da terminale può dare un risultato diverso
PHP da riga di comando e PHP usato dal sito possono caricare file php.ini differenti, versioni differenti o pool differenti. Inoltre il processo web può avere un altro utente, un PATH più ristretto e permessi diversi. Un comando che funziona via SSH non dimostra che funzioni anche da una richiesta HTTP.
Per una diagnosi corretta confronta versione, SAPI, file di configurazione caricato, utente di esecuzione e ambiente. Il controllo definitivo deve essere effettuato nello stesso contesto dell’applicazione, senza lasciare script diagnostici accessibili pubblicamente.
shell_exec è disponibile ma non restituisce output
La funzione può essere disponibile e tuttavia restituire una stringa vuota o null. Le cause comuni includono:
- il comando non produce output standard;
- il programma scrive soltanto sul flusso degli errori;
- il binario non è installato o non è presente nel
PATHdel processo web; - l’utente PHP non possiede i permessi su file, directory o programma;
- il comando richiede un terminale interattivo;
- limiti di tempo, memoria o processi interrompono l’esecuzione;
- restrizioni aggiuntive del sistema operativo o del contenitore negano l’operazione.
Non disabilitare protezioni e non assegnare permessi globali come tentativo. Registra in modo controllato il comando previsto, il codice di uscita quando disponibile e gli errori, senza includere password, token o dati personali. Se serve conoscere il codice di uscita, la documentazione PHP raccomanda una funzione adatta a recuperarlo invece di dedurlo dal solo valore restituito da shell_exec().
Prima di attivare shell_exec su VPS o server dedicato
La presenza dei privilegi amministrativi rende la modifica tecnicamente possibile, ma non automaticamente corretta. Prima di rimuovere shell_exec dall’elenco delle funzioni disabilitate:
- identifica plugin, applicazione e singola funzione che richiedono il comando esterno;
- verifica nella documentazione del produttore il comando esatto, il binario richiesto e le versioni supportate;
- controlla che nessun dato fornito dall’utente venga concatenato alla riga di comando;
- valuta un’API o una libreria PHP che eviti completamente la shell;
- aggiorna sistema operativo, PHP, applicazione e dipendenze;
- esegui il processo con un utente senza privilegi e con accesso minimo ai file;
- definisci limiti di tempo, memoria, processi e dimensione degli input;
- prepara log, monitoraggio, backup e una procedura di ripristino;
- prova la modifica in staging prima di applicarla al sito pubblico;
- documenta il motivo dell’eccezione e rivalutala dopo ogni aggiornamento.
La documentazione PHP avverte che disable_functions, da sola, non costituisce una misura di sicurezza sufficiente per un ambiente condiviso. La protezione deve essere multilivello: isolamento degli account, permessi del filesystem, utente del servizio, aggiornamenti, controllo degli input, limiti delle risorse e monitoraggio.
Come modificare la configurazione su un server amministrabile
Questa operazione è destinata esclusivamente all’amministratore del VPS o server. Prima individua la versione e il gestore PHP realmente usati dal sito. La configurazione della CLI può non coincidere con quella di PHP-FPM, LiteSpeed o un altro handler.
- crea un backup del file di configurazione interessato;
- individua il valore effettivo di
disable_functionsper il sito; - rimuovi esclusivamente
shell_execdall’elenco, senza cancellare alla cieca le altre restrizioni; - verifica sintassi e percorso del file modificato;
- ricarica in modo controllato il servizio o il pool PHP corretto;
- esegui il test non operativo con
function_exists()nello stesso contesto web; - prova la sola funzione applicativa prevista e controlla i log;
- ripristina la configurazione precedente se compaiono errori o comportamenti inattesi.
Non riavviare servizi a caso e non svuotare completamente disable_functions per risolvere un solo requisito. In un servizio Full Managed apri prima una richiesta tecnica: una modifica manuale non concordata può essere sovrascritta, entrare in conflitto con la gestione oppure creare un rischio non compatibile con l’infrastruttura.
Come usare shell_exec in modo più sicuro
Se l’analisi conferma che non esiste un’alternativa, il codice deve eseguire un’operazione strettamente definita. La guida OWASP contro la command injection indica come difesa principale l’uso di API o librerie che non avviano comandi del sistema operativo.
- non accettare una riga di comando completa dall’utente;
- usa una lista chiusa di operazioni ammesse e rifiuta ogni altro valore;
- usa percorsi assoluti per programmi e directory;
- convalida separatamente nomi, estensioni, dimensioni e tipo reale dei file;
- non inserire password, token o chiavi nella riga di comando;
- esegui il processo con privilegi minimi e senza
sudoper l’utente web; - imposta timeout e limiti per impedire processi bloccati o consumo incontrollato;
- separa i lavori lunghi in una coda gestita da un worker;
- registra esito e durata senza salvare dati sensibili;
- mantieni aggiornati sia PHP sia il programma esterno.
escapeshellarg() ed escapeshellcmd() possono aiutare in casi specifici, ma non trasformano automaticamente un comando costruito male in un’operazione sicura. La validazione deve avvenire prima dell’escaping e deve limitare semanticamente i valori ammessi. Quando possibile, evita del tutto l’interprete di shell.
Alternative a shell_exec
| Esigenza | Alternativa preferibile |
|---|---|
| Leggere, copiare o comprimere file | Funzioni filesystem e librerie PHP come ZipArchive, con permessi limitati. |
| Inviare richieste a un servizio | API HTTPS tramite estensione cURL o SDK ufficiale. |
| Elaborare immagini | GD, Imagick o un servizio dedicato, se disponibili e compatibili. |
| Eseguire attività pianificate | Cron di cPanel o pianificazione del server che richiama uno script controllato. |
| Lavori lunghi o asincroni | Coda e worker separato dal processo web, con timeout e monitoraggio. |
| Funzione richiesta da un plugin | Modalità alternativa documentata dal produttore o plugin compatibile con hosting condiviso. |
Prima di migrare su un VPS, chiedi al produttore del software se la funzione è realmente obbligatoria o soltanto uno dei metodi disponibili. Indica versione dell’applicazione, operazione da svolgere e messaggio completo. Non accettare istruzioni generiche come “abilitare tutte le funzioni PHP”: serve conoscere il requisito tecnico preciso.
Cosa indicare all’assistenza Xlogic
Se non sai perché l’applicazione richiede shell_exec(), apri un ticket Xlogic indicando:
- dominio e servizio hosting interessato;
- versione PHP selezionata;
- nome e versione del plugin o dell’applicazione;
- operazione che stavi eseguendo;
- data e ora del tentativo;
- messaggio di errore completo;
- pagina della documentazione che dichiara il requisito;
- alternative già verificate con il produttore.
Non inviare password, chiavi SSH private, token API, cookie, dump completi, codice contenente segreti o output integrale di phpinfo(). Il supporto può confermare il perimetro del piano e aiutare nella diagnosi, ma su un hosting condiviso non trasforma l’account in un ambiente con controllo amministrativo.
Checklist finale
- ho verificato la disponibilità senza eseguire comandi;
- ho controllato sia
function_exists()siadisable_functions; - sto verificando lo stesso PHP e lo stesso contesto usati dal sito;
- conosco il comando e il binario richiesti dall’applicazione;
- ho chiesto al produttore se esiste un metodo senza shell;
- nessun input dell’utente viene concatenato al comando;
- il processo usa permessi minimi, timeout e limiti;
- su un server amministrabile ho backup e piano di ripristino;
- su un servizio Managed ho concordato la modifica prima di applicarla;
- non ho condiviso credenziali o informazioni sensibili nella diagnosi.
Domande frequenti su shell_exec PHP
Posso attivare shell_exec PHP da cPanel su un hosting condiviso?
No, se la funzione è disabilitata nella configurazione di sistema. Il singolo account non può riattivarla con cPanel, .htaccess, .user.ini o ini_set(). Serve una modifica amministrativa non prevista sul server condiviso oppure un ambiente gestibile separatamente.
Come verifico se shell_exec è disponibile senza eseguire comandi?
Controlla function_exists(‘shell_exec’) e la lista restituita da ini_get(‘disable_functions’) nello stesso contesto PHP usato dal sito. Proteggi il file diagnostico e rimuovilo appena terminato il test.
shell_exec può essere attivata su un VPS SSD o server dedicato?
Sì, può essere valutata da chi amministra il sistema. Prima occorre verificare configurazione PHP, isolamento, permessi, origine degli input, aggiornamenti e alternative. Nei servizi Managed la modifica deve essere concordata e non è automatica.
Perché shell_exec restituisce null o nessun output?
Il comando può non produrre output, scrivere soltanto sul flusso degli errori, non essere nel PATH oppure non avere i permessi necessari. Un valore null non consente da solo di distinguere tutte queste condizioni.
È sicuro abilitare shell_exec?
Dipende dall’applicazione e dall’isolamento. Evita la shell quando esiste un’API, non concatenare input degli utenti, usa una allowlist, percorsi assoluti, privilegi minimi, timeout, limiti e monitoraggio. disable_functions da sola non è una protezione completa.