Perl & CGI でパスワード保護

トップ > 気まぐれ実験 > CGI&Perlでパスワード保護

パスワードでページを保護したい!Perl&CGI編

最近助け合いの掲示板で見かけるものに、「ページをパスワードで保護したい」というのがよくあります。自分の作ったページを大勢の人たちに見てもらうためのホームページである一方で、特定の人たちと情報を共有したい、というニーズもあるわけで、だんだんインターネットというツールが一般化してきているのだなぁ、、、と思っているのですが、これって意外に難しかったりします。

以前にパスワードでのページ保護でJavaScriptでの方法を紹介しましたが、その後、もっと強固な方法で、、、とのリクエストがあり、その手法について実験してみることにしました。

はじめに ~ まえがきです

ウェブ・サーバーというのはある意味、そのパソコンの中の情報をインターネット上に共有するための仕組みです。サーバー上にある他人のファイルを自分のパソコンを使ってインターネットを通じて読み込んでいるにすぎません。だから、自分で情報を発信する(共有する)ためのウェブ・サーバーを所有(管理)していれば、ある程度のコントロールができます。たとえば、AさんからのアクセスはOKだけど、BさんからのアクセスはNGとか、通常は見せないようにしているけど、パスワードを入力すると見れるようになるとか、、、

ですが、自分でサーバーを持っている人なんてすごくまれですよね(^^; 通常はどこかのレンタルサーバーを借りていて、そこでホスティングサービスを受けている、というのが現実です。無料ホームページなどでも同じですよね。そこで、どのようにすればパスワードで制限できるのか?ということですが、そのレンタルしているサーバーの仕様によります。

Apacheというサーバーを利用している場合には「htaccess」という設定ファイルを使うことで、サーバーの機能であるベーシック認証という仕組みを使ったパスワード制御が可能です。ですが、レンタルサーバーの中には「htaccess」を使えないところも多いですし、このファイルの「使い方」を知らないとパスワード設定なんてできるはずもなく、ちょっと敷居が高そう、、、というのが初心者的な感想ではないでしょうか?(実際はそんなに難しくないのですけど、、、これもいずれ紹介したいと思います。)

JavaScriptでファイル名をパスワード代わりにする簡易な方法では物足りなくて、掲示板やチャットといったCGI用スクリプトの設置はできるけど、自分でスクリプトを書くということが出来ない人にとっては、そういうCGI用スクリプトがどこかにあって、それを置くだけ!という手軽なものがあれば、、、なんて思いますよね。私もそんなスクリプトが落ちてないかなぁ、、、なんて思ったりもします。

そこで、なければ自分でがんばってみる・・・というのがモットーで、この実験を始めてみました。

有名なサイトなどにあるパスワード制御プログラムはどう?

実験を始める前に、、、有名CGI用スクリプト配布サイトなどで配られているパスワード制御プログラムを使うという手がありますが、どうなんでしょうか?

勝手に例に出してすみません、、、が、たとえば、「KENT-WEB」で配られてるCosmoGate系のプログラムはどうでしょう。大変すぐれたプログラムだと思いますし、強固な方法だと思いますが、不満としてよく聞くのが、多数のページを守りたいけど、うまくできない、とか、公開系以外のフォルダがない場合、実質的に保護できていない、、、ということがあります。

そこで、もっと簡単に、しかも「htaccess」を使うかのように複数ページをなんの細工もせずにフォルダごとパスワードで保護できて、、、というようなプログラムを書いてみることにしました。(えらそうなことを書いていますが、あくまでもアイディアの実験と思っていただければと思います。)

パスワードで保護するには、、、

htaccessを使わずにパスワード機能を使うには、やはりCGI用スクリプトが必要になります。保護しようとしているHTMLファイルを、パスワードを持っている人だけが使えるCGI用プログラムを通してしか見ることができないようにすればOKなので、そのようなCGI用スクリプトを書けばいいのですが、問題は2点あります。

一つは、そのようなCGI用スクリプトを書いても、保護しようとするHTMLファイルを他人から見えないようにしないと保護する意味がない。よって、なんらかの方法で見せないようにする工夫が必要。(逆に、CGI用スクリプトからだけは読めるようにする必要がある。)

もう一つは、ちょっと厄介ですが、そのフォルダにあるファイル複数を全て保護し、かつ普通にページを見ているかのごとくリンクさせたい、、、ということになると、保護されたHTMLファイルのリンク用のタグの中身をすこし変形させる必要がある、ということです。(意味わからなかったらごめんなさい)

どうやって見せないようにするか!

先ほどもかきましたが、そもそも不特定多数に見せることを前提に動いているウェブ・サーバー内のファイルです。ですが、パスワードで保護するためには、とりあえず見せないようにする必要があります。ではどうしたらいいのでしょうか?

レンタルしているサーバーに「公開するためのフォルダー(public_htmlという名前がついていたりします。)」以外のフォルダーがあればいいのですが(意味がわからない場合は、ないと思ってください。)、それがない場合は、FTPでアップロードすれば、そこのファイルはインターネットから不特定多数にアクセスされるわけです。

そこで、やり方が2通りあります。

アクセス権の設定をする場合

Unix系のOSでサーバーが動いている場合、アップロードしたファイルにアクセス権というのをつけることが出来ます。CGIでお勉強したパーミッションが755とか644とかいうやつです。この3桁の数字は上の桁から、所有者、グループ、その他というようになっていて、数字はそれぞれ4(読み)、2(書き)、1(実行)というようになっていて、この組み合わせ(足し算)によって表現されています。

たとえば、7というのは(4+2+1)で読み書き実行全て可能なファイルという意味であり、6なら(4+2)で読み書きだけが出来るファイルということです。掲示板用のログファイルのパーミッションが666だったりするのは、読み書きできる必要があるからです。

通常この3桁の一番右側が不特定多数の人たち(その他)がアクセスする場合のパーミッションであり、644の一番右側の4がそれにあたります。当然4なので、普通の人たちはHTMLファイルにアクセスしても「読み」しかできず、「書き」は出来ません。逆に「書き」ができると内容を書き換えることができる、ということです。

このパーミッションの一番右側の数字を「0」にする、つまり、640とか600とかにすれば、一般の方々からは見えない(読めない)ファイルになります。

意図的に読み込みエラーにする場合

もう一つの方法です。おそらくこちらの方がほとんどの方の場合有効なので、こちらの方法で見せないようにすることになると思うのですが、、、

通常、ホームページのファイルは「○○.html」とか「○○.htm」ですよね。これを内容を全く変えずに拡張子だけ変更して「○○.cgi」にしたらどうなるでしょうか?一度試してください。おそらく「Internal Server Error」といったようなエラーになると思います。これは、通常CGIという拡張子はCGIプログラムを動かすために使われるような設定になっているため、ウェブ・サーバーはそのようなファイルが起動されると、CGIを使う準備を始めるのですが、読み出されたファイルはCGI用になっていないので(普通のHTMLファイルなので)、動かない、、、つまりエラーになるというわけです。

たいていのレンタルサーバーはそのような設定になっているので、拡張子を「○○.cgi」にすることで、簡単にファイルを読めなくすることができます。

ただし、あくまでも「たいていの場合」です。cgiという拡張子に実行権がついていないような設定では、逆にファイルが見えてしまうこともあります。一度、仮につくった適当なファイルを置いてみて、読めるかどうか試してからにしてくださいね。

読めなくしたファイルを特定の人だけに見せる!

さあ、ファイルを読めなくできましたよね。そこで、次が、やっと課題の「特定の人だけに見せる!」という方法をとればいいのです。CGI用スクリプトで、拡張子を「○○.cgi」にしたHTMLファイルを都度読み込んで、表示するだけでOKです。これでCGI用スクリプトにアクセスできる人だけがそのファイルを読むことができる、という環境を作り出すことができます。

そして、そのCGIを利用するには、パスワードを要求する。これで、パスワードで保護されたファイルの出来上がりということになります。

保護をしたまま自由にリンクするには、、、

1ページだけを保護するなら、以上でいいのですが、これならKENTさんのところのCosmoGate系で十分です。ただ、そのフォルダの中全てを保護して、かつ自由にリンクでいったり来たりできるためには、表示するファイルを多少変更する必要があります。

これでは意味がわからないと思うので、すこし具体的に書くと、、、

あなたのホームページ「http://www.yourpage.com/」があったとして、ここの「http://www.yourpage.com/private/」というフォルダ内を全てパスワードで保護したいとします。ここに、秘密にしたいHTMLファイルを入れて、上で説明したようなCGI用スクリプトを設置して読み込んだ場合、最初に読み込んだページは保護されて表示されます。が、そのページに、同じフォルダ内を参照しているリンクがあった場合はどうなるでしょうか?

保護したいファイルの拡張子を「CGI」に変えるのはそれほど面倒なことではないのですが、リンクとなると別物です。あなたのパソコンでうまくリンクされるように、「http://www.yourpage.com/private/test01.html」から「http://www.yourpage.com/private/test02.html」にリンクを張るためには、test01.htmlに書かれているリンク用のHTMLタグまで、「test02.cgi」に変更しなくてはなりません。

<a href="test02.html">

上のリンク先が下のように変更されなければ・・・

<a href="test02.cgi">

これでは、使い勝手が悪いですよね。テストで保護したいページをつくり、サーバーでテストしてみるときは、ソースの中まで書き換える、、、そういう面倒を解消するために、CGIと拡張子が変更されたHTMLファイルを読み込んだときに、その中のリンク用HTMLタグを見つけ出し、拡張子をリアルタイムで変えてくれるようなソースが必要、ということです。

パーミッションによるアクセス制御をしているなら、このような問題は発生しませんが、拡張子でコントロールしようとすると、少々難しいですよね、、、

ですが、とりあえず簡単に作ってみましたので、興味ある方は下から利用してみてください。

ダウンロードはこちらから・・・(2004/01/25 公開)

(2004/1/17 by あいまい)
(2004/1/25 更新)

トップ > 気まぐれ実験 > CGI&Perlでパスワード保護

日時: 2008年01月21日 10:15
newsingに投稿BuzzurlにブックマークBuzzurlにブックマークlivedoorクリップに投稿 Choixにブックマーク イザ!ブックマーク このエントリーを含むはてなブックマーク
トップに戻る
このエントリーの所属カテゴリ: 気まぐれ実験の小部屋
このエントリーのタイトル:Perl & CGI でパスワード保護



copyright © 2000-2008 all rights reserved
あいまいモード・コム - rss2.0 atom
newsingに投稿BuzzurlにブックマークBuzzurlにブックマークlivedoorクリップに投稿 Choixにブックマーク イザ!ブックマーク このエントリーを含むはてなブックマーク