## 3 例

標準の `RExec` クラスよりも、若干、もっと緩めたポリシを 望んでいるとしましょう。例えば、もし /tmp 内のファイルへの書き込みを 喜んで許すならば、`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'):
                # ファイル名をチェックします :  /tmp/ で始まらなければなりません
                if file[:5]!='/tmp/':
                    raise IOError, " /tmp 以外へは書き込みできません"
                elif (string.find(file, '/../') >= 0 or
                     file[:3] == '../' or file[-3:] == '/..'):
                    raise IOError, "ファイル名の '..' は禁じられています"
            else: raise IOError, "open() モードが正しくありません"
            return open(file, mode, buf)

上のコードは、完全に正しいファイル名でも、時には禁止する場合があることに 注意して下さい；例えば、制限された環境でのコードでは、/tmp/foo/../bar というファイルはオープンできないかもしれません。これを修正するには、 `r_open()` メソッドが、そのファイル名を /tmp/barに単純化 しなければなりません。そのためには、ファイル名を分割して、それにさまざまな 操作を行う必要があります。セキュリティが重大な場合には、 より複雑で、微妙なセキュリティホールを抱え込むかもしれない、一般性のある コードよりも、 制限が余りにあり過ぎるとしても単純なコードを書く方が、 望ましいでしょう。