2013-01-12 16 views
9

Ho un file dal quale ho soppresso ogni autorizzazione. Nessuno dovrebbe essere in grado di leggere il file, giusto? In realtà, se corroJava - file.length() restituisce anche se il file non è leggibile

File f = new File("not_readable.pdf"); 
System.out.println(f.canRead()) 

ottengo

false 

Tuttavia, se chiamo

File f = new File("not_readable.pdf"); 
System.out.println(f.length()) 

ottengo

455074 

Mi pare di capire che, al fine per ottenere la dimensione di un file bisogna aprirlo e leggerlo per prima cosa, ma questo risultato suggerisce fortemente che mi sbaglio. Qualcuno sa perché questo accade? Inoltre, c'è un modo per impedire al metodo file.length() di accedere alla dimensione di un file?

Sto usando Ubuntu 12.10

+0

Il filesystem ext * salva le dimensioni? Prova questo: 'cat/dev/urandom> file; chmod 000 file; ls -sh file; "Potrei sbagliarmi, ma sono abbastanza sicuro che' ls' possa leggere le dimensioni del file anche se le autorizzazioni sono zero. – BenjiWiebe

+6

Perché devi aprire il file per ottenere la lunghezza? Ciò verrebbe memorizzato nelle informazioni della directory nel file system. – OldProgrammer

risposta

16

vi sbagliate: la lunghezza di un file è il file system di metadati (almeno per i file system che girano sotto Linux VFS). Chiunque abbia letto i permessi su una directory può vedere tutti i file contenuti e le loro dimensioni. Per evitare che gli utenti vedano le dimensioni di un file, devi impedire loro di vederlo del tutto, cioè posizionare il file in una directory che ha permessi come drwxr-x--- se l'utente non è nel gruppo associato alla directory, o drwx------ se l'utente è in quel gruppo.

2

Non vedo perché è necessario l'accesso in lettura per visualizzare le dimensioni di un file. In Linux, ls visualizzerà il contenuto di tutti i file nella directory (inclusa la loro dimensione), anche se non si dispone di autorizzazioni su di essi, a condizione che si disponga delle autorizzazioni appropriate per la directory che contiene il file. La dimensione di un file è una proprietà della tabella di allocazione file, non del file stesso, quindi length() non ha bisogno di ispezionare il file stesso (e sarebbe piuttosto inefficiente per ottenere la lunghezza contando il numero di byte in il file).

Problemi correlati