Esegui qualsiasi convalida sulle directory quando le elimini ricorsivamente?

2

In che modo elimini in modo ricorsivo i percorsi dei dati creati dalla tua app?

Il processo di eliminazione di per sé è banale. La domanda è: fai una validazione extra? E se sì, che tipo?

Da un certo punto di vista, forse è semplicemente un compito scomodo da fare, ma dall'altra, immagina se il programma ha un bug e qualcosa passa "c: \" alla funzione ricorsiva, o se c'è un overflow di memoria e alcuni dati diventano corrotti, causando il troncamento dei percorsi su cui lavori ecc.

Esiste anche un modo per eseguire una convalida pulita?

    
posta Coder 17.08.2011 - 11:34
fonte

3 risposte

2

Ti suggerisco di utilizzare uno stack thread-safe per tenere traccia di tutti i file e le directory temporanee specifici che hai creato e in quale ordine.

Dopo il completamento dell'elaborazione (o durante la gestione delle eccezioni), hai quindi un elenco completo di azioni da eseguire (al contrario, quindi utilizzando uno stack) per tornare allo stato precedente pulito.

Nota che solo i file e le directory che effettivamente crei dovrebbero andare nella tua lista di pulizia. Se vai a creare C:\Temp\MyApp , ed esiste già, non dovresti provare a eliminarlo dopo, anche se lo faresti normalmente. È possibile che qualcuno abbia inserito altri dati che non hai generato in quella directory.

Nel complesso, dovresti essere molto attento sull'eliminazione di file e directory temporanei, specialmente se lo fai in modo ricorsivo e ancor più specialmente se sono fuori dalla directory temporanea del sistema operativo.

Se non sei assolutamente sicuro che hai creato qualcosa, stai meglio non eliminandolo.

Un utente potrebbe ottenere annoyed con alcuni file temporanei extra che non è stato pulito correttamente, ma è probabile che siano arrabbiati se elimini i file che effettivamente voluto mantenere.

Inoltre, se un bug nella tua applicazione causa la cancellazione di tutti i file di dati degli utenti, potresti essere considerato negligente dal punto di vista professionale e in alcuni punti che potrebbe portare a una causa legale per danni .

    
risposta data 17.08.2011 - 15:07
fonte
4

Penso che la convalida dovrebbe essere sempre in azione, ma non per ogni cartella che si tenta di eliminare, solo per la cartella di livello superiore, per assicurarsi di non avere, per caso, emesso il comando di cancellazione per c:\windows\system32 ad esempio .

Tuttavia, non scrivi il metodo delete in molti framework e chiami semplicemente una funzione della libreria che usi. Ad esempio, in .NET è sufficiente chiamare Directory.Delete(path, true) e il secondo argomento specifica se si desidera un'eliminazione ricorsiva o meno.

Se il framework che usi ha un meccanismo integrato, allora semplicemente fidati. Perché le operazioni di I / O vengono testate milioni di volte in diverse applicazioni.

Tuttavia, se vuoi creare la tua implementazione, ti consiglio comunque di convalidare il percorso prima di ogni azione di cancellazione.

    
risposta data 17.08.2011 - 11:41
fonte
4

Secondo me, è principalmente responsabilità del sistema operativo prevenire le eliminazioni indesiderate.

Ad esempio, le cartelle più importanti sono protette da scrittura da Windows 7. La loro eliminazione fallirà con un'eccezione. Su Unix, dovrai assicurarti che siano in possesso delle autorizzazioni appropriate per il file system e non puoi fare molto danno.

Tuttavia, conosciamo tutti un amministratore di sistema che ci ha raccontato la storia del suo comando rm -rf / accidentale, pubblicato come root.

Come per le applicazioni: assicurati che le autorizzazioni del filesystem siano configurate ragionevolmente, quindi puoi prevenire almeno qualche danno. È consigliabile eseguire applicazioni con i privilegi minimi necessari.

Se il tuo programma deve essere eseguito come root, per qualsiasi motivo, quindi inserire un codice per verificare se la posizione da eliminare non è fondamentale per il sistema. O chroot il sistema per l'applicazione.

Puoi anche white-list le directory che possono essere cancellate e ricontrollare ogni volta, se questo ti fa sentire al sicuro. Ma la corruzione della memoria, per esempio, ha la possibilità di sfondare qualsiasi routine di validazione. Se disponi di dati temporanei, conservali in una cartella ben nota e non distribuirli su tutto il sistema.

Modifica: Ora ho parlato con vari colleghi di lavoro e abbiamo ispezionato i nostri codici e indovinato: tutte le directory che stiamo eliminando sono costanti codificate. Ci sono solo alcuni casi in cui i file vengono cancellati, principalmente per estensione o il nome con cui iniziano. Quindi nella maggior parte dei casi un altro livello di validazione è semplicemente inutile e un test unitario è sufficiente per assicurarsi che la directory corretta sia cancellata o cancellata.

Ora, potrebbero esserci altri casi in cui i percorsi sono combinati con variabili di ambiente e così via. Ma quando la variabile d'ambiente è impostata sul valore sbagliato e si colpisce per caso una directory che non avrebbe dovuto essere cancellata, chi avrebbe dovuto farlo se non il sysadmin? Chiaramente, questo rientra nelle sue responsabilità allora.

L'unico caso limite che posso immaginare sono le eliminazioni tramite espressioni regolari. Ma a che servono le espressioni regolari per l'eliminazione quando si desidera convalidare i nomi dei file con l'elenco bianco? O a che servono le convalide tramite espressioni regolari quando si eliminano le espressioni regolari?

L'unico caso in cui suggerirei una sorta di convalida whitelist è quando concatenate ciecamente le stringhe per creare un nome di directory. Ma preferirei avere un test unitario decente per questo.

E protezione contro la corruzione della memoria: beh, c'è poco che puoi fare, perché non puoi garantire alcun tipo di comportamento quando ciò accade.

    
risposta data 17.08.2011 - 11:50
fonte

Leggi altre domande sui tag