ファイルやディレクトリに対する操作をアクセスといい、読む、書く、実行するの3種類に分類されます。
ホームページやブログは多くの人がアクセスするため、ファイルやディレクトリが勝手に削除されたり内容を変更されたりしないように、ファイルやディレクトリのアクセス権限をきちんと管理することが必要です。
パーミッション(permission)は、この3種類のアクセスをどのように許可するかを示すものです。
ここでは、PHPでのパーミッションの定義とパーミッションを扱うための方法を説明します。
PHPプログラミングに興味のある方は、プログラミング学習の参考として、ぜひ読んでみてください。
目次
ファイルパーミッションとは
パーミッションは、読み出しや書込み、実行などのファイルへのアクセスに対する許可情報です。
パーミッション
パーミッションは以下の3種類に区分されます。
ファイルの場合
アクセス権 | 表示 | 説明 |
---|---|---|
読み込み | r | ファイル内容の表示などが可能 |
書き込み | w | ファイルの 編集や上書きコピーなど が可能 |
実行 | x | プログラムやシェルスクリプトの実行などが可能 |
ディレクトリの場合
アクセス権 | 表示 | 説明 |
---|---|---|
読み込み | r | ディレクトリに登録されているファイル名の表示などが可能 |
書き込み | w | 新規ファイル作成、削除、名前変更などが可能 |
実行 | x | ディレクトリ内のファイルへのアクセスなどが可能 |
ディレクトリに実行のアクセス権が設定されていない場合は、ディレクトリ内のファイルに読み込みが許可されていても読み出すこともできません。
また、Unix系システムでは上記以外のパーミッションが定義される場合もあります。
ユーザー区分
このアクセス権はユーザーの区分ごとに設定することが可能であり、ユーザー区分は以下の3種類です。
ユーザー区分 | 表示 | 説明 |
---|---|---|
所有者 | u(user) | ファイルやディレクトリの所有者であるユーザー |
グループ | g(group) | グループに属するユーザー |
その他 | o(other) | その他 |
表記法
各ファイルやディレクトリのパーミッションを表示する形式はさまざまですが、八進表記と記号表記がよく使われます。
八進表記
パーミッションを3桁の八進数値で表現する方法です。
各ユーザー区分のパーミッションを八進数1桁で表します。以下の3つの数値を加算した値です。
数値 | 説明 |
---|---|
4 | 読み出しを可とする |
2 | 書き込みを可とする |
1 | 実行を可とする |
したがって、八進数の各数値と悪巣の可否は以下のとおりです。
数値 | 読み出し | 書き込み | 実行 |
---|---|---|---|
7 | 可 | 可 | 可 |
6 | 可 | 可 | × |
5 | 可 | × | 可 |
4 | 可 | × | × |
3 | × | 可 | 可 |
2 | × | 可 | × |
1 | × | × | 可 |
0 | × | × | × |
なお、4桁の場合は、先頭の1桁がその他のパーミッションあるいはファイル種別を表します。その他パーミッションなどを設定しないときは0がセットされます。
記号表記
パーミッションを10文字の文字列で表現する方法です。
文字列は、4つのパートに分かれています。最初のパートは、1文字でファイルの種別を示します。残りの3つのパートは、各々3文字で構成され、ユーザー区分ごとのパーミッションを表します。
記号表記のパーミッションの構成
ファイル種別 (1文字) |
所有者のパーミッション (3文字) |
グループのパーミッション (3文字) |
その他のパーミッション (3文字) |
ファイル種別は以下のとおりです。
記号 | 説明 |
---|---|
– | 一般のファイル |
d | ディレクトリ |
l | シンボリックリンク |
OSによる違い
これまでに説明してきたパーミッションの定義はUNIX/LinuxなどのOSの場合です。
WindowsではACL(Access Contorl List)を使用した管理が行われています。ファイルプロパティのセキュリティタブをご覧になるとイメージが理解できるでしょう。
ファイルパーミッションの設定
なぜファイルパーミッションの適切な設定が必要なのか?
WEBではセキュリティ対策が重要
ホームページやブログなどのWEBアプリにはインターネットを通じていろんな人がアクセスしてきます。中には、悪意のあるプログラムによってファイルを書き換えたりしようとするかもしれません。
パーミッションを適切に設定して、こうした不正なアクセスを制限することで、ファイルを保護できるのです。
例えば、パーミッションが644であれば、所有者以外のユーザーでもファイルの内容を読みだすことはできますが、書き込むことはできません。こうしておけば、悪意のあるプログラムでファイルを書き換えられてしまうリスクを減らすことができます。
動作不良を起こさない
では、すべてのファイルを書き込み禁止とした場合はどうなるでしょうか?
先ほどのお悪意のあるプログラムによるファイルの書き換えなどへの対応は強固になりセキュリティ面ではよいかもしれません。
しかし、例えば、WordPressなどでは、セキュリティ対応のためなどから、常に新しいバージョンにアップデートされる可能性があります。しかも、自動でアップデートする場合もあります。
しかし、このアップデート時に書き込みの権限が与えられていないと、アップデートが失敗に終わり、今度はWordPressの動作自体に不具合が起きてしまう可能性があります。
こうしたことから、各ファイルやディレクトリには、その役割に応じた適切なパーミッションを設定することが重要です。
ファイルパーミッションの設定とあわせてセキュリティ対策を行なうには下記も参考に。
【初心者必見】WordPressでよく起こるエラーやトラブルの対処法適切なパーミッションとは?
ファイルの種類ごとに一般的なパーミッション設定を以下に示します。レンタルサーバなどでは一般的でないパーミッション設定は禁止している場合もあります。
ファイルの種類 | 八進表記 | 記号表記 | 補足 |
---|---|---|---|
ディレクトリ | 705(,755) | rwx—r-x、rwxr-xr-x | |
htmlやphpファイル | 644 | rw-r–r– | .html / .php / .zip など |
.htaccess | 644 | rw-r–r– | |
CGI 実行ファイル | 705(、755) | rwx—r-x、rwxr-xr-x | .cgi / .pl など |
CGIのデータファイル | 600 | rw——- | .cgi / .pl など |
データやログ | 600 | rw——- | .txt / .dat / .log など |
PHPのパーミッションやPHPを設置しているディレクトリのパーミッションが 777 や 666 の場合、エラーとするレンタルサーバもあります。
アクセス権限に関するエラーなどについては以下も参考にしてください。
HTTPステータスコードってなに?ファイルパーミッションを扱う関数
chmod
指定されたファイルのモードを permissions で指定したものに変更。
1 |
chmod ( string $filename , int $permissions ) |
パラメータ
パラメータ | 型 | 説明 |
---|---|---|
filename | string | ファイルへのパス |
permissions | int | 3桁(所有者、グループ、その他のユーザー)のアクセス権限を表す数値。 各桁は、1(実行)、2(書き込み)、4(読み込み)の組合せ。 八進表現(先頭に0をつける)とするのが望ましい。 |
返り値
成功した場合に true を、失敗した場合に false を返します。
記述例
1 2 3 4 5 6 7 8 |
<?php // 所有者に読み込みと書き込みの権限、それ以外は権限なし。 chmod(ファイルパス名, 0600); // 所有者に読み込みと書き込みの権限、それ以外は読み込みのみ許可。 chmod(ファイルパス名, 0644); // 所有者に全ての権限、それ以外は読み込みと実行を許可。 chmod(ファイルパス名, 0755); ?> |
fileperms
指定したファイルのパーミッションを取得する
1 |
fileperms ( string $filename ) |
パラメータ
パラメータ | 型 | 説明 |
---|---|---|
filename | string | ファイルへのパス |
返り値
- ファイルのパーミッションを数値モードで返します。
- 失敗時に false を返します。
- このモードの下位ビットは chmod() に渡すのと同じ形式です。
- 大半のプラットフォームでは、filename のファイル形式に関する情報も含むため、各OSのドキュメントを参照。
記述例
1 2 3 4 |
<?php echo substr(sprintf('%o', fileperms('/tmp')), -4); echo substr(sprintf('%o', fileperms('/etc/passwd')), -4); ?> |
結果
1 2 |
1777 0644 |
アプリケーションログなどでもファイルパーミッションの設定は重要です。以下を参考にしてください。
アプリケーションログの設計・管理についてまとめ
いかがでしたか? 今回は、PHPでファイルパーミッションを扱う方歩を紹介しました。ホームページやブログを安全に適切に運営するには、ファイルのパーミッションをキチンと管理しておくことが大事です。固定のHTMLファイルなどはWEBサーバに格納した時に確認しておけば問題ないのですが、PHPでアクセスするファイルはパーミッションが実行時に変更される可能性が高いため、プログラムでミスのないように設定する必要があります。
この記事が、PHPプログラミングの学習の参考としてお役に立てば幸いです。