Contatta l'assistenza

Rispondiamo per e-mail, di solito entro due giorni.

Per prevenire abusi, Google reCAPTCHA verifica questo invio; alcuni dati vengono trasmessi a Google. Lo script viene caricato solo quando apri questo modulo.

← Tutti gli articoli

Una copia nella cartella web è una fuga di sorgente

Prima di modificare un file grande, il gesto naturale è copiarlo. cp index.php index.php.prima-della-modifica, poi al lavoro. Se quel file si trova nella cartella che il server web pubblica, hai appena reso l'intero codice sorgente scaricabile come testo semplice — credenziali del database, segreti, tutto ciò che il file contiene.

Apache passa index.php attraverso PHP perché finisce in .php. index.php.prima-della-modifica non finisce in .php. Finisce in .prima-della-modifica, di cui Apache non ha mai sentito parlare, quindi fa la cosa predefinita e manda i byte.

La regola che quasi tutti scrivono, e perché non basta

La protezione abituale è un elenco di estensioni vietate: .bak, .orig, .save, .sql, .old. Prende il file a cui hai pensato. Provato qui, quell'elenco ha dato la risposta giusta per probe.bak e quella sbagliata per ognuno di questi:

  • index.php.vor-xyz — è così che è successo davvero
  • index.php.2026-08-19
  • index.php.kopie
  • style.css.alt
  • index.php.1

Tutti serviti con 200. Lo schema di nome a cui non hai pensato è proprio quello che userai, perché le copie si chiamano come ciò che stavi facendo in quel momento.

Rovesciare il taglio

La regola che funziona non chiede quali estensioni siano vietate. Pone una domanda strutturale: questo nome di file contiene un'estensione di codice che non sta alla fine?

Se sì, è la copia di qualcosa che doveva essere eseguito, qualunque cosa dica il suffisso dopo. index.php.qualsiasi-cosa corrisponde. style.css.qualsiasi-cosa corrisponde. Lo schema copre i nomi che nessuno ha ancora inventato, ed è tutto il punto.

Verificato oggi sul server in funzione: tutti e cinque i nomi qui sopra restituiscono ora 403, compresi quelli che non esistono — la regola nega la forma, non il file.

L'eccezione, e cosa insegna

Un nome di file legittimo qui ha esattamente quella forma: le risorse pre-compresse si scrivono come style.css.1787777226.gz, con un'estensione in mezzo per costruzione. La regola porta perciò un'unica eccezione stretta per un segmento di cifre seguito da .gz, e quel file restituisce 200 come deve.

È su un'eccezione così che di solito queste regole cedono, quindi vale la pena dire cosa rende sicura questa: è stretta abbastanza da non permettere di costruire index.php.qualcosa.gz e riprendersi il sorgente, perché il segmento di mezzo deve essere di sole cifre. Un'eccezione più larga — «qualsiasi cosa finisca in .gz» — avrebbe restituito l'intera regola.

E il consiglio più semplice resta quello che rende tutto ciò superfluo: tieni le copie fuori dalla cartella pubblicata. La regola è una rete per il giorno in cui te ne dimenticherai, non un permesso per smettere di badare a dove finisce la copia.

Pubblicità