このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

ユーザー/パスワード認証

発言者:横地宣重
( Date Friday, January 09, 1998 16:22:04 )


重松修 さんの書いていただいたスクリプトは、各違うファイルに、パスワード
/ログインを使って認証し、アクセスするスクリプトですよね? あのスクリプト
をつかうには、ログイン/パスワードの書いてある別ファイルを用意して
つかうのでしょうか?もうすこし、詳しく書いていただければさいわいです。
よろしくおねがいします。


重松修 さんからのコメント
( Saturday, January 10, 1998 13:29:34 )

重松です。

基本的には、パスワードは別のファイルに書いておきますね。それが面倒なら、
任意のパスワードを設定できませんが、IDから計算して作る方法もありますけど。
これは計算ですから、別にパスワードを記録する必要はありませんけど、
セキュリティは甘いですね。

パスワードの扱いについてはいろいろと問題がありますが、暗号化など面倒な
ことをしなくても、WWWサーバしか走っていなくて、それほど大量に必要なければ、
田中先生のSTRResOSAXを利用してリソースフォークに保持すれば、基本的に
安全です。
# WWWサーバはリソースフォークを送信しないので、外部から閲覧できません。

ただし、現状STRResOSAXは名前でのリソースの取得に対応しないので、IDを数字
にするなどの工夫が必要でしょう。

もし、データフォークに保持するのであれば、暗号化などの手段を講じた
方がよいでしょう。

もっとも原始的なのはUserNameにリダイレクトするファイル名、Passwordに共通の
パスワードを入れておけば、外部ファイルはいりませんね。
カード程度ならば、この程度でよいのではと思いますが。

横地宣重 さんからのコメント
( Monday, January 12, 1998 00:25:34 )

どうも、御回答ありがとうございます。
このまえ、サンプル用のスクリプトをかいていただきましたが、
あの、サンプルを、どうも、上手く起動できないのですが^^;;
REAMMEみたいなものをかいてもらえないでしょうか^^;;
なにせ、アップルスクリプトは初心者ですので よろしくおねがいします。

横地宣重 さんからのコメント
( Tuesday, January 13, 1998 20:08:28 )

この、前に書いていただいだ、スクリプトなんですが
property crlf : (ASCII character 13) & (ASCII character 10)

on ヌevent WWWスsdocネ path_args ツ
  given ヌclass kforネ:search_args, ヌclass postネ:post_args, ヌclass userネ:username, ヌclass passネ:password
  try
    set myMessageID to search_args
    if (username = "username" and password = "password") then
      return "HTTP/1.0 302 Found" & crlf ツ
        & "MIME-Version: 1.0" & crlf ツ
        & "Location: /chrismascard/" & username & ".html" & crlf & crld
    else
      return "HTTP/1.0 401 Unauthorized" & crlf ツ
        & "MIME-Version: 1.0" & crlf ツ
        & "WWW-Authenticate: Basic realm=\"Redirect Realm\"" & crlf & crlf ツ
        & "<TITLE>Not Authorized!</TITLE>" & crlf ツ
        & "<H1>Not Authorized!</H1>" & crlf
    end if
  on error
    return "HTTP/1.0 200 OK" & crlf ツ
      & "MIME-Version: 1.0" & crlf ツ
      & "Content-type: text/html" & crlf ツ
      & crlf ツ
      & "<TITLE>ERROR</TITLE>" & crlf ツ
      & "ERROR" & crlf
  end try
end ヌevent WWWスsdocネ
ですが、これを、きまったユーザーネーム/パスワード処理させて、
決まったページにアクセスさせるには、user/passwd, そのあとの
/chrismas/のとこへ、アクセスさせるページをいれておくことで、
できるようになるのでしょうか?
よろしくおねがいします。

田中求之 さんからのコメント
( Tuesday, January 13, 1998 22:25:45 )

>決まったページにアクセスさせるには

return "HTTP/1.0 302 Found" & crlf ツ
 & "MIME-Version: 1.0" & crlf ツ
 & "Location: /chrismascard/" & username & ".html" & crlf & crlf

というのが、ページのリダイレクトを指示するヘッダーです。で、
Location: の後に、アクセスさせたいページの URL を書いておけば、皆、そのページへ
アクセスするようになります。

たとえば、

return "HTTP/1.0 302 Found" & crlf ツ
 & "MIME-Version: 1.0" & crlf ツ
 & "Location: http://mtlab.ecn.fpu.ac.jp/webcon.mtxt" & crlf & crlf

と書いておくと、認証をパスした人間はすべてこの会議室にやって来ることになります。
URL の後に crlf を2つ付ける必要がありますので、この点は注意してください。

横地宣重 さんからのコメント
( Wednesday, January 14, 1998 15:20:46 )

cgi のほうは、わかりましたけが、それにふぞくする、htmlは
これは、このような書き方でいいのでしょうか?
<html>

<head>

<title>ログイン画面</title>

</head>
<body bgcolor="#ffffff">

<center>
パスワードを入力して下さい。</font>
</td>
</tr>
</table>

<br>

<form action = "/pass1.acgi" method="get" enctype="application/x-www-form-urlencoded">

<p>


<table border="0" cellpadding="5" cellspacing="0">

<tr>

<td align="right" valign="top" width="50%">

<font size ="4">

<b>ユーザネーム</b></td>

<td align="left">

<input type="text" name ="username" size="10" maxlength="7"></td>
  </tr>

<tr>

<td align="right" valign="top" width="50%">

<font size ="4">

<b>パスワード</b></td>

<td align="left">

<input type="text" name ="password" size="10" maxlength="7"></td>
  </tr>


</table>

  <br><br>
  <br><br><br><br><br><br><br>
  </blockquote>
  
  
  
  


<br>

<input name="end" type="hidden" value="">

<input type="submit" value="ログイン">

重松修 さんからのコメント
( Wednesday, January 14, 1998 17:59:54 )

違いますよ。(ToT)

<A HREF="/cgi-bin/realm.acgi">ログイン</A>

です。

FORMで処理するのではありません。もしFORMで処理するのであれば、usernameや
passwordではなく、post argumentsのリストを参照する必要があります。

違いはおわかりいただけてますか?

それから、FORMで処理するとまったく素のデータが送られるようです。だから、
だれかが覗くと丸見えです。それに対して、usernameとpasswordは簡単に
暗号化されているような気がします。(気のせい?)

くどいようですが、HTTPヘッダによる制御と、FORMによるPOSTは根本的に
動作内容も原理もまったく異なります。上記のHTMLで不安になったので、
もう一度書きますか、ヘッダによるコントロールの場合、

(1) CGIはユーザーネームとパスワードを要求する。
(2) ユーザーネームとパスワードを入力する。2度目以降のアクセスなら、
ブラウザが勝手に前回のユーザーネームとパスワードを送信する。
(3) CGIは受け取ったユーザー名、パスワードが正しければ、リダイレクト処理
を行なう。もし、間違えていると、(1) にもどる。

となります。

それに対してフォームの場合は、

(1) フォームによりユーザーネームとパスワードを入力する。前回のを覚える
にはクッキーなどを使う必要がある。
(2) CGIはFORMで送信されたデータからユーザーネーム、パスワードを抽出し、
正しい場合か続きの処理をする。正しくない場合は、正しくないよ、という
処理をする。

という流れが一般的です。(サンプルを示してないから)

だなので、ヘッダによるコントロールの場合は2回アクセスしているんです。
1回に見えても。

システムが全然違うんです。根本的に。


重松修 さんからのコメント
( Wednesday, January 14, 1998 18:08:57 )

それと、スクリプトは動かして見ましたか?

ならば、なにも特殊なHTMLを書かなくても動くということが理解できるはずです。

まだ一度もCGIを自分のサーバで実行したことがないのであれば、先ずは、
単純なスクリプトを実行して、それをちょっとずつ改編したりして、
基本を勉強してください。

田中先生のEasyBBS Classicを初め大変素晴しいサンプルがたくさん公開されて
いますから。

また、AppleScriptはものすごく簡単な言語ですし、Macでは珍しくたくさんの
参考書が入手できます。


また、これはイチオシですが、インターネットサーバ構築術という本が
オーム社から出ています。田中先生も執筆されていてとにかくわかりやすく
情報も豊富で、精力的にアップデートされているのでぜひぜひ買ってください。
WWW、メール、FTPにCGIとMacintoshのサーバの情報、ノウハウが満載です。
# 私はオーム社とは無関係です。


田中求之 さんからのコメント
( Wednesday, January 14, 1998 21:06:13 )

>暗号化されているような気がします。(気のせい?)

単純に Base64 でエンコードされているようです。ですから、Form の垂れ流し
と較べて、さほどセキュリティ上安全というわけではないですね。


横地宣重 さんからのコメント
( Friday, January 16, 1998 19:03:20 )

ありがとうございました。サンプルのスクリプトはおかげさまで、
うごきました。フォームをつかってユーザー認証をしたいので
その本を参考に頑張ってみます。

田中求之 さんからのコメント
( Friday, January 16, 1998 22:09:26 )

>フォームをつかってユーザー認証をしたいので

フォームを使うのでしたら、いわゆる Realm によるユーザー認証ではなく、
CGI によるユーザー管理を行うことになります。この点はお間違いのないよ
うに。