C言語

【C言語】access関数の使い方、正しく理解していますか?

関数仕様

書式

引数

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 関数を使ってチェックするのは、セキュリティホールの原因になる。

例えば、チェックをしてから実際にファイルのオープン操作をする間の短い間隔を悪用し、
ファイルをすり替えられる。

 

サンプルプログラム

 

こちらの記事もよく読まれています

  • この記事を書いた人
  • 最新記事
SANACHAN

SANACHAN

「生涯一エンジニア」を掲げ、大手グローバル企業でSE/PGとして8年勤め、キャリアアップ転職した現役のエンジニアです。世にあるメジャーな全プログラム言語(コボル除く)を自由に扱えます。一児の父。自分のため、家族のため、日々勉強してます。システムエンジニア、プログラミングに関する情報を蓄積している雑記帳です。

-C言語
-, ,