実行権を調べる

Perl/CGIプログラム の実行権限を調べてみましょう。

UNIX系サーバーの場合、ユーザーがアップロードした Perl/CGIプログラム というのはある実行権限に基づいて動作しています。

共用レンタルサーバーの場合、1台のサーバーに複数のユーザーが存在しますよね。

その場合、ユーザーがアップロードしたPerl/CGIプログラムというのは…。

各ユーザーをひとまとめにした権限で実行される場合と、専用に割り当てられた単一のユーザー権限で実行される場合とがあります。

Perl/CGIプログラミングをする上で、どの実行権を与えられているのかを知っておくことはとても大切です。

なぜなら、ファイルやフォルダのパーミッション設定や、セキュリティー対策が変わってくるからです。

ということでこのページでは、あなたがインターネットサーバーにアップロードしたPerl/CGIプログラムファイルが、どの実行権限を与えられているのかを調べてみましょう。

  1. UNIXのUIDとは
  2. 実UIDと実効UIDの違い
  3. ユーザー名を調べる
  4. CGIの実効権を調べる

UNIXのUIDとは

UIDとは、UNIX系OSにおいて各ユーザーに割り当てられた個別番号のことです。

当然UNIX系のインターネットサーバーの場合、Perl/CGIプログラムからUIDを取得することができます。

UNIXがPerl/CGIプログラム実行のために割り当てるUIDには、実UIDと実効UIDの2種類があります。

Perl/CGIプログラミングでは、特殊変数「$<」または「$>」を参照することにより、実行している「ユーザーID(UID)を取得することができます。

しかし、これら2種類のUIDというのは見てわかるように表現方法が似ているので間違えやすくなっています。

実UIDと実効UIDの違い

実UIDと実効UIDの違いについてまとめておきましょう。

実UIDとは、Perlスクリプトを実効(起動)したUIDのことで、Perl/CGIプログラミングでは特殊変数「$<」で参照します。

実効UIDとは、Perlスクリプトを実行したとみなされるUIDのことで、Perl/CGIプログラミングでは特殊変数「$>」で参照します。

ということで、実UIDと実効UIDを表示させるPerl/CGIプログラムを作成してみましょう。

#!/usr/bin/perl

print "Content-type: text/html; charset=shift_jis\n\n";
if ($^O =~ /MSWin32/i) {
print 'Unknown';
} else {
print '実UID:', $<, "<br>\n";
print '実効UID:', $>, "<br>\n";
}
exit;

if文 パターンマッチ サーバーOSの種類を判定 し、UNIX系サーバーであれば実UIDと実効UIDを表示させています。

通常のレンタルサーバーであれば、実UIDと実効UIDは同じであることが多いと思います。

しかし、専用サーバーでは異なる場合があります。

ユーザー名を調べる

Perl/CGIプログラムで、UNIXサーバーが割り当てた実UIDと実効UIDの取得方法がわかったので、今度はユーザー名を調べてみましょう。

Perl/CGIプログラムでユーザー名を取得するには、getpwuid関数を使います。

#!/usr/bin/perl

use strict;

print "Content-type: text/html; charset=shift_jis\n\n";
if ($^O =~ /MSWin32/i) {
print 'Unknown';
} else {
my $real_uid = $<;
my $real_name = getpwuid($real_uid);
my $effective_uid = $>;
my $effective_name = getpwuid($effective_uid);
print "実UID : $real_uid ($real_name)<br>\n";
print "実効UID : $effective_uid ($effective_name)<br>\n";
}
exit;

このPerl/CGIプログラムを実行すると、実UIDと実効UID、さらにそれぞれのユーザー名を表示します。

getpwuid関数は、引数にUIDを指定すると、ユーザー名を返してくれます。

CGIの実効権を調べる

Perl/CGIプログラムの実効権限を調べてみましょう。

Perl/CGIプログラムの実効権限を調べるには、CGIを実行するユーザーのUIDと、そのファイルの所有者(オーナー)のUIDを取得し比較します。

この2種類のUIDが同じものであれば、所有者権限でCGIが実効される環境であることがわかります。

逆に違う場合は、他のユーザ権限でCGIが実行されているということです。

#!/usr/bin/perl

use strict;

print "Content-type: text/html; charset=shift_jis\n\n";
if ($^O =~ /MSWin32/i) {
print 'Unknown';
} else {
my $filename = &GetThisFileName;
my $real_uid = $<;
my $owner_uid = (stat($filename))[4];
if ($real_uid eq $owner_uid) {
print "Owner権限で実行<br>\n";
} else {
print "Other権限で実行<br>\n";
}
}
exit;


sub GetThisFileName {
my $string = "";

if ($0) {
$string = $0;
} elsif ($ENV{'SCRIPT_NAME'}) {
$string = $ENV{'SCRIPT_NAME'};
} elsif ($ENV{'SCRIPT_FILENAME'}) {
$string = $ENV{'SCRIPT_FILENAME'};
} elsif ($ENV{'REQUEST_URI'}) {
$string = $ENV{'REQUEST_URI'};
} else {
return;
}

my ($part) = split(/\?/, $string);
my @parts = split(/\//, $part);
my $name = pop @parts;

return $name;
}

__END__

このPerl/CGIプログラムファイルの所有者UIDを調べるには、stat関数を使います。

stat関数は指定されたファイル情報を取得する関数です。

指定するファイルは、 サブルーチン GetThisFileNameでこのPerl/CGIプログラムのファイル名を調べて 渡しています。

普通にstat関数を呼び出すと、指定したファイル情報が 配列 形式で帰ってきます。

この中で必要な所有者UIDは5番目の要素に格納されています。

添え字は0からはじまるため、添え字4を指定して所有者UIDのみ取り出します。

あとは、 if文 で実UIDと所有者UIDを比較し、一致すればオーナー権限でCGIが実効されていることがわかります。

逆に違う場合は、他のユーザ権限でCGIが実行されているということがわかるという仕組みです。

<戻る>