Perl Perl_2 パーミッション
Perl 「 モジュール 」 CGI.pm フォーム ディレクトリのパーミッション (0x10c)

目次 - Perl Index
Theme
Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x10c 回。
CGI.pm で、実用的なファイルアップロードの処理を確認する前に、アップロード先に指定するディレクトリのパーミッションを確認する。
ファイルをアップロードするディレクトリ
(0x10a) で確認した、ファイルアップロードのための Perl プログラムでは、アップロード先に「 UPFILE/ 」という名前のディレクトリを指定しました。
HTML フォームを通じて、ファイルの書き込みを行う場合、実際にプログラムを起動して、ファイルを書き込むのは Web サーバ ( ここでは Apache ) の仕事になるので、アップロード先のディレクトリ UPFILE/ には、Web サーバの実行ユーザ ( www ) が書き込めるパーミッションを設定しておく必要があります。
このため、ファイルのパーミッションを確認した前回 (0x10b) に続き、今回は、ディレクトリのパーミッションを確認します。
ディレクトリのパーミッション
ディレクトリのパーミッションは、基本的にファイルのパーミッションと同じです。なぜなら、ディレクトリは、ファイルのリストを持ったファイルとして扱われるからです。
しかしながら、ディレクトリはファイルと違い、中身を確認 ( ls ) したり、その中に移動 ( cd ) したり、その中にファイルを作成したりします。
ですから、ディレクトリに対するパーミッションでは、ファイルに対するパーミッションの概念とは少し異なる概念が必要です。
「 r 」読み込み許可
ディレクトリに対する読み込み ( read ) 許可は、ディレクトリが持っている ( ディレクトリの中にある ) ファイル名のリストを "読み込む" ことが出来ます。
つまり、コマンド「 ls 」を使う等して、ファイルリストを取得出来るという事です。
通常のファイルの中身を "読み込む" 行為とほとんど同等だと理解しています。
ただし、「 ls -l 」とオプションを付けて、ファイル名以上の情報を得ることや、コマンド「 cat 」等でディレクトリ配下のファイルの中身を表示することは出来ません。
これには読み込み (r) に加えて実行 ( x) の許可が必要です。
「 w 」書き込み許可
ディレクトリに対する書き込み ( write ) 許可は、ディレクトリの中に、ファイルを新規作成する ( 新規ファイルの情報を書き込む ) ことが出来ます。
新規ファイルの情報の書き込みが出来るという事は、既存ファイルの情報を "削除する" という情報も書き込むことが出来ます。つまり、ファイルの削除も行えます。
これも、通常のファイルに "書き込む" 行為とほとんど同等だと理解しています。
しかしながら、許可された権限が純粋に書き込み ( w ) のみでは、ファイルの作成も削除も出来ません。それには実行 ( x ) の許可が必要です。
「 x 」実行許可
ディレクトリに対して実行 ( execute ) 許可を与えると、ディレクトリの中に移動 ( cd ) することが出来ますが、移動したところでファイルリストの取得等、出来ないことが多いのでとても不便です。
しかしながら、上記で確認した通り、ファイル名以外の情報を取得したり、ファイルを作成・削除したりする場合に、読み込み ( r ) や書き込み ( w ) の許可と組み合わせると有用です。
許可された権限が、純粋に実行 ( x ) だけの場合は、ディレクトリ配下のファイル名を直接指定出来れば、コマンド「 ls -l 」や、「 cat 」( もちろん vi 等のエディタも ) を利用してファイルデータの閲覧や、そのファイルに対してデータの書き込み ( 上書き・追加等 ) が出来ます。
上書きによって、データを編集することは出来ますが、ファイルそのものの削除は出来ません。ファイルの削除には実行 ( x ) に加えて、書き込み ( w ) の許可が必要です。
アップロードファイルの保存
ファイルアップロードのターゲットにするディレクトリ UPFILE/ に、HTML フォーム経由でファイルを作成するには、「 所有者 」「 グループ 」「 その他 」のユーザクラスの中で、「 その他 」クラスのパーミッションを考慮する必要があります。
なぜなら、Web サーバのユーザ権限が、ファイルの所有者から見て「 その他 」のクラスに属するためです。
前項までに確認した、ディレクトリのパーミッションを踏まえつつ、実際にファイルを作成出来るパーミッションを確認します。 なお、「 グループ 」クラスのパーミッションはひとまず不要なので、すべての権限を無効にしています。
結果的には次の様になりました。
701 drwx-----x : no
702 drwx----w- : no
703 drwx----wx : yes !
704 drwx---r-- : no
705 drwx---r-x : no
706 drwx---rw- : no
707 drwx---rwx : yes !
8 進数の「 703 」つまり、「 その他 」クラスに対して、書き込み ( w ) と、実行 ( x ) の許可を与えてあげれば良い訳です。
0x10c-> 0x10d へ
#// sticky bit メモ
/tmp の様に、誰でもアクセス可能なディレクトリは、他人のファイルを ( 削除を含む ) 操作が出来てしまうことがあるが、ディレクトリに sticy bit を設定することで、所有者 ( と super user とディレクトリの所有者 ) 以外のユーザからはファイルの操作が出来なくなる。
元来ファイルに利用された設定だが、現在では主にディレクトリに使われる。既に本来の用途から離れた利用法が一般的であるため、「 sticky 」( ねばねばした ) という名称は形骸化している。
参考情報は書籍「 初めての Perl 第 6 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。
目次 - Perl Index
Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)