$ENV{'REMOTE_USER'}はhttp://q.hatena.ne.jp/1132444049を見て認証すると設定されるもので、書き換えるのは難しいというのはわかりました。

$ENV{'REMOTE_USER'}で参照できますが、中に格納したいときはどうすればよいのでしょうか?
perlで下記のプログラムを書きました。
hello1.cgi、hello2.cgi同じ内容です。

#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print "<HTML><BODY>\n";
print "$ENV{'REMOTE_USER'}\n";#①
$ENV{'REMOTE_USER'}="g";#②
print "$ENV{'REMOTE_USER'}\n";#③
print "</BODY></HTML>\n";
exit;

IDをguestでログインして、
hello1.cgiにアクセスすると「guest g」が出力されました。
次に、
hello2.cgiにアクセスすると「guest g」が出力されました。

hello1.cgiで、REMOTE_USERにgが代入されて、hello2.cgiでは「g g」が出力されるのかどうかを実験しました。上記の方法では、書き換えができないようです。何個か認証スクリプトダウンロードしてソース見てみましたが、$ENV{'REMOTE_USER'}=$nameというような処理をしているものもありまして、どんなコードにしたら書き込むことができるでしょうか。ソースコード読むのも不慣れで、認証の種類、仕組みについての知識もあいまいです。
よろしくお願いします。

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:2006/04/14 06:28:56
  • 終了:2006/04/17 08:04:59

ベストアンサー

id:JULY No.3

JULY回答回数966ベストアンサー獲得回数2472006/04/16 22:28:19

ポイント85pt

■ディレクトリ・ゲイトやYahooのように、制限のあるページにアクセスすると、ダイアログではなくて、ログイン画面が表示されるものは、基本認証とはちがうというこになりますでしょうか?

正式な名前があるかどうか分かりませんが、フォーム認証とか HTML フォーム認証と呼ばれる事が多いと思います。

この場合、HTML のフォームデータとしてユーザ情報やパスワードが送られます。基本認証の場合は、そもそも HTTP プロトコル上で、ユーザ名、パスワードの受け渡し方が決まっていて、CGI が直接ユーザ名やパスワードを受け取ることはありません。

そうなると、CGI 側で「誰がログインしているのか」が分からなくなってしまうので、Web サーバ側が REMOTE_USER という環境変数にユーザ名をセットしておいてくれるので、CGI はこの環境変数を参照すれば良い、ということになります。

フォーム認証をする場合、そのユーザ名、パスワードは単純にフォームのデータとして送られてくるだけで、それに対してどのように認証処理を行うかは、CGI の作者次第です。ただ、普通は複数の CGI でログインしているユーザ名を把握するために仕組みが必要になってきて、その仕組みを適切に行わないとセキュリティホールにもなるので、安易なプログラミングは禁物です。

■ディレクトリ・ゲイトがもし、基本認証と違うということであれば、どのようにサーバ側は認証ということを理解して、環境変数REMOTE_USERを設定しているのでしょうか?

端的に言うと、フォームを使った認証の場合であれば REMOTE_USER という環境変数を使う必要がありません。CGI 中の勝手な変数で扱ってかまいません。REMOTE_USER という環境変数は、Web サーバが基本認証の処理をした結果が格納されている、ということですので、CGI から REMOTE_USER という環境変数に設定する必然性はありません。また、その「ユーザを認証する」という行為自体が CGI 側で行われるので、Web サーバにとっては「認証を必要としない URL にアクセスがあった」ことになるので、REMOTE_USER にユーザ名をセットすることもありません。

Basic認証 - Wikipedia

上記 URL は基本認証の仕組みについて書かれたものです。ついでに説明しておくと、基本認証の他に HTTP プロトコル上でよく使われる認証方式にダイジェスト認証というのがあります。エンドユーザから見た挙動は同じで、ダイアログでユーザ名、パスワードが要求されます。

Apachのページ拝見しましたが、「REMOTE_USER:CGI スクリプトに認証が必要なときにのみ設定されます。」ということでした。認証しますっていうことをCGIプログラムが書かないとサーバ側でも環境変数 REMOTE_USERを設定することができないと思うのですが。どういうコードを書くとサーバ側で環境変数REMOTE_USERを設定してくれるのでしょうか。

前の回答でも書きましたが「基本認証をします」という設定は、あくまでも Web サーバ側です。基本認証をするのに CGI は関係ありません。例えば、単なる HTML ファイルを Web サーバに置いて、でも、認証されたユーザしか見ることとが出来ない、という用途もあります。こうなれば何処にも CGI プログラムは関係ないですよね。Web サーバでは特定の URL にアクセスする場合には基本認証が必要、という設定をします。

ǧ�ڡ���ǧ��������������...

(どうもタイトルが文字化けするようですが...)

上記 URL で「AuthType」や「AuthName」「AuthUserFile」といったキーワードが出てきますが、これがまさに Web サーバに対して基本認証の設定をするためのものになります。

先の Apache で REMOTE_USER に設定する mod_cgi というモジュールは、Apache 上で CGI プログラムを実行する際に動作するモジュールで、基本認証はこの mod_cgi が呼ばれる前に終わっています。

「CGI スクリプトに認証が必要なときにのみ設定されます。」というのは、mod_cgi が呼ばれた時点で基本認証処理が行われていたら、その結果を REMOTE_USER に設定することを意味します。CGI が置かれた URL に対して基本認証の設定が無ければ、当然 REMOTE_USER に値が設定されません。

id:rain2003

>「単なる HTML ファイルを Web サーバに置いて」

.htaccess置いたら、CGIとか関係なくダイアログ出てきました!よくわかりました。

>「ついでに説明しておくと~」

この説明もすごく助かりました。

>「端的に言うと~」

フォームを使ったCGIは、CGIの処理で設定しているんですね。とするとフォームを使ったCGIは、ソースコード見るとなんとなく思ったのは、クッキーを使っているんでしょうか。

再質問しようかと思っていたところで、ずばりの回答いただけたのですごく感謝です。

2006/04/17 08:01:21

その他の回答(2件)

id:tpichu No.1

tpichu回答回数304ベストアンサー獲得回数12006/04/14 07:33:36

ポイント15pt

$ENV{'REMOTE_USER'}変数は、クライアント側から、基本認証で取得したデータ(ID)が記録されます。

あくまでこの変数は、記録されたものであり、元のクライアント側のユーザー名を変更するにはいたりません。

また、引数を渡して処理したとしても、デコード処理をするときに環境変数%ENVに格納するというむちゃくちゃな方法以外$ENV{'REMOTE_USER'}の値を変更する手段はありません。

やり方としては、すべてのスクリプトのはじめに$ENV{'REMOTE_HOST'}="(任意の文字)";と書くのが一番よいでしょう。

http://q.hatena.ne.jp/1132444049

id:rain2003

$ENV{'REMOTE_HOST'}="(任意の文字)";は$ENV{'REMOTE_USER'}="(任意の文字)";でよろしかったでしょうか。

http://www.webpower.jp/websofts/others/web_protection/direct...こちらの認証CGIを例にしてお尋ねしたいのですが、このCGIでもREMOTE_USERが取得できます。”$ENV{'REMOTE_USER'}変数は、クライアント側から、基本認証で取得したデータ(ID)が記録されます。”というのが前提だとするとこのCGIも基本認証を使ってREMOTE_USERにID名を格納しているのでしょうか?

このdirgate.cgiで、下記のようなコードがあるのですが、

$ENV{'REMOTE_USER'} = $username;

$ENV{'AUTH_ID'} = $SESSION_ID;

# </環境変数設定>

$ENV{'REMOTE_USER'}が書き換えられないのに、この処理をするのは意味が無いように思うのですが。何らかの理由で、ENV{'REMOTE_USER'}というただの変数に$usernameを代入したのでしょうか。あと、認証後格納されるということですが、このCGIのソースコードでは何行目の処理で環境変数REMOTE_USERの中にユーザー名が格納されるのでしょうか。以下の回答はこちらについてお願いします。

2006/04/14 09:13:34
id:JULY No.2

JULY回答回数966ベストアンサー獲得回数2472006/04/14 11:57:03

ポイント15pt

mod_cgi - Apache HTTP ������

このCGIのソースコードでは何行目の処理で環境変数REMOTE_USERの中にユーザー名が格納されるのでしょうか。

環境変数 REMOTE_USER は CGI プログラムが設定するものではなく、Web サーバ自体が設定するものです。

また、基本認証(あるいはベーシック認証)の処理自体も Web サーバで行われるものです。アクセスするとダイアログでユーザ名、パスワードが表示されるのが、いわゆる「基本認証」で、これを実施するかどうかは Web サーバの設定で「このパス以下にアクセスするときには基本認証が必要」といった設定を行います。

ですので Web サーバが認証処理を行って、環境変数をセットしてから CGI プログラムを呼び出すことになります。上記 URL は Apache が CGI プログラムを実行するためのモジュール「mod_cgi」のマニュアルで、mod_cgi が設定する環境変数「CGI 環境変数」に関しての記述があります。

よって、ある CGI プログラムで REMOTE_USER の値を設定しても、別の CGI プログラムが呼び出されたときには、Web サーバが REMOTE_USER の値を本来の値(基本認証上のユーザ名)で上書きしているので、元の質問にあるような挙動になります。

id:rain2003

>アクセスするとダイアログでユーザ名、パスワード

>が表示されるのが、いわゆる「基本認証」

当方、勉強する時間も少ない上に駆け出しですので丁寧なご説明ありがとうございます。少しずつわかってきました。まだまだ、疑問な点がありまして引き続きよろしくお願いします。

■ディレクトリ・ゲイトやYahooのように、制限のあるページにアクセスすると、ダイアログではなくて、ログイン画面が表示されるものは、基本認証とはちがうというこになりますでしょうか?

■ディレクトリ・ゲイトがもし、基本認証と違うということであれば、どのようにサーバ側は認証ということを理解して、環境変数REMOTE_USERを設定しているのでしょうか?Apachのページ拝見しましたが、「REMOTE_USER:CGI スクリプトに認証が必要なときにのみ設定されます。」ということでした。認証しますっていうことをCGIプログラムが書かないとサーバ側でも環境変数REMOTE_USERを設定することができないと思うのですが。どういうコードを書くとサーバ側で環境変数REMOTE_USERを設定してくれるのでしょうか。

2006/04/14 12:44:18
id:JULY No.3

JULY回答回数966ベストアンサー獲得回数2472006/04/16 22:28:19ここでベストアンサー

ポイント85pt

■ディレクトリ・ゲイトやYahooのように、制限のあるページにアクセスすると、ダイアログではなくて、ログイン画面が表示されるものは、基本認証とはちがうというこになりますでしょうか?

正式な名前があるかどうか分かりませんが、フォーム認証とか HTML フォーム認証と呼ばれる事が多いと思います。

この場合、HTML のフォームデータとしてユーザ情報やパスワードが送られます。基本認証の場合は、そもそも HTTP プロトコル上で、ユーザ名、パスワードの受け渡し方が決まっていて、CGI が直接ユーザ名やパスワードを受け取ることはありません。

そうなると、CGI 側で「誰がログインしているのか」が分からなくなってしまうので、Web サーバ側が REMOTE_USER という環境変数にユーザ名をセットしておいてくれるので、CGI はこの環境変数を参照すれば良い、ということになります。

フォーム認証をする場合、そのユーザ名、パスワードは単純にフォームのデータとして送られてくるだけで、それに対してどのように認証処理を行うかは、CGI の作者次第です。ただ、普通は複数の CGI でログインしているユーザ名を把握するために仕組みが必要になってきて、その仕組みを適切に行わないとセキュリティホールにもなるので、安易なプログラミングは禁物です。

■ディレクトリ・ゲイトがもし、基本認証と違うということであれば、どのようにサーバ側は認証ということを理解して、環境変数REMOTE_USERを設定しているのでしょうか?

端的に言うと、フォームを使った認証の場合であれば REMOTE_USER という環境変数を使う必要がありません。CGI 中の勝手な変数で扱ってかまいません。REMOTE_USER という環境変数は、Web サーバが基本認証の処理をした結果が格納されている、ということですので、CGI から REMOTE_USER という環境変数に設定する必然性はありません。また、その「ユーザを認証する」という行為自体が CGI 側で行われるので、Web サーバにとっては「認証を必要としない URL にアクセスがあった」ことになるので、REMOTE_USER にユーザ名をセットすることもありません。

Basic認証 - Wikipedia

上記 URL は基本認証の仕組みについて書かれたものです。ついでに説明しておくと、基本認証の他に HTTP プロトコル上でよく使われる認証方式にダイジェスト認証というのがあります。エンドユーザから見た挙動は同じで、ダイアログでユーザ名、パスワードが要求されます。

Apachのページ拝見しましたが、「REMOTE_USER:CGI スクリプトに認証が必要なときにのみ設定されます。」ということでした。認証しますっていうことをCGIプログラムが書かないとサーバ側でも環境変数 REMOTE_USERを設定することができないと思うのですが。どういうコードを書くとサーバ側で環境変数REMOTE_USERを設定してくれるのでしょうか。

前の回答でも書きましたが「基本認証をします」という設定は、あくまでも Web サーバ側です。基本認証をするのに CGI は関係ありません。例えば、単なる HTML ファイルを Web サーバに置いて、でも、認証されたユーザしか見ることとが出来ない、という用途もあります。こうなれば何処にも CGI プログラムは関係ないですよね。Web サーバでは特定の URL にアクセスする場合には基本認証が必要、という設定をします。

ǧ�ڡ���ǧ��������������...

(どうもタイトルが文字化けするようですが...)

上記 URL で「AuthType」や「AuthName」「AuthUserFile」といったキーワードが出てきますが、これがまさに Web サーバに対して基本認証の設定をするためのものになります。

先の Apache で REMOTE_USER に設定する mod_cgi というモジュールは、Apache 上で CGI プログラムを実行する際に動作するモジュールで、基本認証はこの mod_cgi が呼ばれる前に終わっています。

「CGI スクリプトに認証が必要なときにのみ設定されます。」というのは、mod_cgi が呼ばれた時点で基本認証処理が行われていたら、その結果を REMOTE_USER に設定することを意味します。CGI が置かれた URL に対して基本認証の設定が無ければ、当然 REMOTE_USER に値が設定されません。

id:rain2003

>「単なる HTML ファイルを Web サーバに置いて」

.htaccess置いたら、CGIとか関係なくダイアログ出てきました!よくわかりました。

>「ついでに説明しておくと~」

この説明もすごく助かりました。

>「端的に言うと~」

フォームを使ったCGIは、CGIの処理で設定しているんですね。とするとフォームを使ったCGIは、ソースコード見るとなんとなく思ったのは、クッキーを使っているんでしょうか。

再質問しようかと思っていたところで、ずばりの回答いただけたのですごく感謝です。

2006/04/17 08:01:21

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません