関数仕様
書式
1 2 3 4 |
#include <unistd.h> int access (const char *filepath, int mode); |
引数
filepath | アクセス権をチェックするファイルのパス |
mode | チェックするアクセス権(下記フラグの論理和) |
modeで設定するフラグ
フラグ | 意味 |
R_OK | 読み出し許可と、ファイルの存在をチェック |
W_OK | 書き込み許可と、ファイルの存在をチェック |
X_OK | 実行許可と、ファイルの存在をチェック |
F_OK | ファイルの存在をチェック |
戻り値
0 | 引数 mode で指定したアクセス権がある |
-1 | 引数 mode で指定したアクセス権がない、またはエラーが発生 |
機能
- ファイル filepath に対する実ユーザーでのアクセス権をチェックする
- filepath がシンボリックリンクの場合、シンボリックリンクは展開される
- 呼び出し元プロセスが特権プロセス(プロセスの実 UID が 0)の場合、
通常のファイルに対する X_OK のチェックは、そのファイルの所有者、グループ、
他人のいずれかの 実行許可が有効になっていれば成功する。
注意すること
注意ポイント①
チェックに利用されるユーザー、グループは、実ユーザー、実グループの権限で行われる。
access 関数によるアクセス権のチェックは、他のシステムコールとは異なる。
access を呼び出したプロセスの実行ユーザー、実行グループではなく、
実ユーザー、実グループの権限で行われる。
例えば、root にセットユーザーIDされたコマンドの中から access が呼び出されたとしても、
root 権限ではなく、元のユーザーでの権限でアクセス権のチェックが行われる。
注意ポイント②
あるユーザーが、例えば open() によるアクセスが可能かどうかを、
実際に行う前に access 関数を使ってチェックするのは、セキュリティホールの原因になる。
例えば、チェックをしてから実際にファイルのオープン操作をする間の短い間隔を悪用し、
ファイルをすり替えられる。
サンプルプログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <unistd.h> #include <stdio.h> #define FILE_PATH "./test.dat" int main (void) { /* 読み込み許可と実効許可があるかをチェック */ if (access (FILE_PATH, (R_OK | X_OK))) { perror ("access"); return -1; } printf ("Confirm result (R_OK | X_OK): PASS!\n"); return 0; } |