28.1.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に単純化 しなければなりません。そのためには、ファイル名を分割して、それにさまざまな 操作を行う必要があります。セキュリティが重大な場合には、 より複雑で、微妙なセキュリティホールを抱え込むかもしれない、一般性のある コードよりも、 制限が余りにあり過ぎるとしても単純なコードを書く方が、 望ましいでしょう。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。