17.1.3 Un esempio

Mettiamo di voler imporre una condotta un p� meno rigida rispetto alla classe RExec predefinita. Per esempio, se vogliamo permettere la scrittura di file in /tmp, possiamo derivare la classe RExec:

class TmpWriterRExec(rexec.RExec):
    def r_open(self, file, mode='r', buf=-1):
        if mode in ('r', 'rb'):
            pass
        elif mode in ('w', 'wb', 'a', 'ab'):
            # controlla il nome del file: deve iniziare con /tmp/
            if file[:5]!='/tmp/': 
                raise IOError, "can't write outside /tmp"
            elif (string.find(file, '/../') >= 0 or
                 file[:3] == '../' or file[-3:] == '/..'):
                raise IOError, "'..' in filename forbidden"
        else: raise IOError, "Illegal open() mode"
        return open(file, mode, buf)
Notate che il codice sopra proibir� occasionalmente l'apertura di un nome di file perfettamente valido; per esempio, il codice in un ambiente limitato non sar� in grado di aprire un file chiamato /tmp/foo/../bar. Per correggere questo difetto, il metodo r_open() dovrebbe semplificare il nome del file a /tmp/bar, che richiederebbe l'estrazione del nome del file e l'esecuzione di varie operazioni su questo. Nei casi in cui � in gioco la sicurezza, pu� essere preferibile scrivere codice pi� semplice che sia qualche volta particolarmente restrittivo, invece di un codice pi� generale ma anche molto complesso che possa contenere un subdolo problema di sicurezza.
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.