chmod()
chmod() è una funzione PHP per modificare i permessi di un file o directory, controllando chi può accedere e con quali diritti.
Capire la funzione PHP chmod()
chmod() modifica il mode (i bit dei permessi) di un file o directory su un filesystem di tipo Unix. Il mode controlla chi può fare cosa con il file: leggerne il contenuto, scriverci sopra o eseguirlo. Impostare i permessi correttamente è importante per la sicurezza: permessi troppo aperti consentono a chiunque di leggere o sovrascrivere dati sensibili; troppo restrittivi e il server web non riesce a leggere i file che deve servire.
Questa pagina tratta la sintassi, come leggere e scrivere il mode ottale, i valori di permesso più comuni che utilizzerai davvero, il valore di ritorno e le insidie più frequenti (lo zero iniziale, umask e Windows).
Sintassi
chmod(string $filename, int $permissions): bool| Parametro | Descrizione |
|---|---|
$filename | Percorso del file o della directory di cui si vogliono modificare i permessi. |
$permissions | Il nuovo mode, come intero ottale (ad esempio 0644). |
Restituisce true in caso di successo e false in caso di errore.
Come funziona il mode ottale
Il mode è un numero ottale a tre cifre. Ogni cifra descrive una classe di utenti:
| Posizione della cifra | Si applica a |
|---|---|
| 1ª (es. 644) | Proprietario del file |
| 2ª (es. 644) | Gruppo |
| 3ª (es. 644) | Altri (tutti gli altri) |
Ogni cifra è la somma dei permessi concessi a quella classe:
| Valore | Permesso |
|---|---|
4 | Lettura |
2 | Scrittura |
1 | Esecuzione |
0 | Nessuno |
Sommandoli: lettura + scrittura = 4 + 2 = 6, e lettura + esecuzione = 4 + 1 = 5. Quindi 0750 significa proprietario: lettura/scrittura/esecuzione (7), gruppo: lettura/esecuzione (5), altri: nessuno (0).
In PHP, il mode deve essere scritto con uno zero iniziale affinché venga interpretato come ottale. chmod("file.txt", 644) passa il numero decimale 644, che corrisponde al valore ottale 1204 — quasi certamente non quello che si vuole. Scrivi sempre 0644.
Valori di permesso comuni
| Mode | Proprietario | Gruppo | Altri | Uso tipico |
|---|---|---|---|---|
0644 | lettura/scrittura | lettura | lettura | File ordinari (HTML, immagini, config letti dal server) |
0600 | lettura/scrittura | – | – | File privati (credenziali, chiavi) |
0755 | lettura/scrittura/esecuzione | lettura/esecuzione | lettura/esecuzione | Directory e script eseguibili |
0700 | lettura/scrittura/esecuzione | – | – | Directory private |
0777 | tutto | tutto | tutto | Raramente una buona idea — chiunque può leggere e sovrascrivere |
Esempi
Impostare i permessi su un singolo file
Il mode 0644 consente al proprietario di leggere e scrivere, mentre il gruppo e tutti gli altri possono soltanto leggere:
<?php
if (chmod("example.txt", 0644)) {
echo "Permissions updated.";
} else {
echo "Failed to change permissions.";
}Rendere uno script eseguibile
Per eseguire direttamente uno script PHP (ad esempio un cron job da CLI), il proprietario ha bisogno del permesso di esecuzione:
<?php
chmod("backup.php", 0744); // owner: rwx, group & others: read onlyControllare sempre il valore di ritorno
chmod() fallisce silenziosamente restituendo false — ad esempio quando lo script non è il proprietario del file. Non dare per scontato che abbia funzionato:
<?php
$file = "config.ini";
if (!chmod($file, 0600)) {
error_log("Could not secure {$file}");
}Insidie comuni
- La proprietà è importante. Un processo può eseguire
chmod()solo su un file di cui è proprietario (oppure come superutente). Sull'hosting condiviso l'utente del server web spesso non è il proprietario, quindi la chiamata restituiscefalse. umasknon influisce suchmod(). A differenza dimkdir()e della creazione di file,chmod()imposta esattamente il mode richiesto. L'umaskmaschera solo i file appena creati — vedi umask().- Windows ignora la maggior parte dei bit. NTFS non dispone di un modello di permessi Unix, quindi su Windows solo il bit di sola lettura è effettivamente influenzato.
- Verifica prima di modificare. Usa is_writable() per testare l'accesso e fileperms() per leggere il mode corrente prima di sovrascriverlo.
Funzioni correlate
- fileperms() — legge i bit dei permessi correnti di un file.
- is_writable() — verifica se lo script può scrivere in un percorso.
- umask() — imposta la maschera predefinita applicata ai file appena creati.
- mkdir() — crea una directory con un determinato mode.
Conclusione
chmod() è lo strumento per restringere o allargare l'accesso a file e directory da PHP. Ricorda le tre regole che prevengono la maggior parte dei bug: scrivi il mode in ottale con uno zero iniziale, scegli il permesso minimo che funziona ancora (0644 per i file, 0755 per le directory) e controlla il valore di ritorno, perché la funzione fallisce silenziosamente quando lo script non è proprietario del target.