W3docs

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
ParametroDescrizione
$filenamePercorso del file o della directory di cui si vogliono modificare i permessi.
$permissionsIl 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 cifraSi 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:

ValorePermesso
4Lettura
2Scrittura
1Esecuzione
0Nessuno

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).

Attenzione

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

ModeProprietarioGruppoAltriUso tipico
0644lettura/scritturaletturaletturaFile ordinari (HTML, immagini, config letti dal server)
0600lettura/scritturaFile privati (credenziali, chiavi)
0755lettura/scrittura/esecuzionelettura/esecuzionelettura/esecuzioneDirectory e script eseguibili
0700lettura/scrittura/esecuzioneDirectory private
0777tuttotuttotuttoRaramente 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 only

Controllare 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 restituisce false.
  • umask non influisce su chmod(). A differenza di mkdir() e della creazione di file, chmod() imposta esattamente il mode richiesto. L'umask maschera 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.

Pratica

Pratica
Cosa fa la funzione chmod in PHP?
Cosa fa la funzione chmod in PHP?
Was this page helpful?