この特集のトップページへ
Chapter 8:プレゼンテーション層の構築

8.2.1 基本的なASPプログラム
●ユーザーからの入力
 では次に,ユーザーがWebページのフォームに入力した文字列をASPから取得する方法について説明する。

○基本的なフォーム情報の受信
 まずは,基本的なフォームの送信例として,ユーザーがフォーム内に入力したテキストを取得するスクリプトについて考えてみる。

 ここではList 8-10に示すフォームを用意する。このフォームは名前(USERNAMEフィールド)とメールアドレス(EMAILフィールド)の2つの入力フィールドを備えており,Webブラウザで参照したときの表示はFig.8-33のようになる。

Fig.8-33 List 8-10の実行結果
fig8_33

 Fig.8-33において,ユーザーが[送信]ボタン(SUBMITボタン)を押すと,List 8-10の3行目の“ACTION=”で指定されているwform.aspが呼び出される。そしてこのとき,wform.aspに対してユーザーが入力した名前(USERNAMEフィールド)とメールアドレス(EMAILフィールド)の情報が送信されることになる。

 単に入力された名前とメールアドレスをそのまま出力する場合,wform.aspList 8-11のように記述できる。List 8-11の出力結果はFig.8-34のようになる(Fig.8-34は,Fig.8-33の[名前]に“F.Osawa”を,[メールアドレス]に“osawa@example.co.jp”を入力したものである)。

Fig.8-34 List 8-11の実行結果
fig8_34

 List 8-11の3行目や4行目にあるように,ユーザーがWebフォームのフィールドに入力した文字列は,Requestコレクションを使い,“Request("フィールド名")”として取得することができる。つまり,“Request("USERNAME")”のようにすると,Webフォームの“<INPUT TYPE="TEXT" NAME="USERNAME">”フィールドに入力された文字列が取得でき,“Request("EMAIL")”のようにすると,同様に“<INPUT TYPE="TEXT" NAME="EMAIL">”フィールドに入力された文字列を取得できることになる。ちなみに,Requestコレクションに指定されたフィールド名が存在しないときには,EMPTY値が戻る仕様になっている。

 ただし,ASPの文法的には,“Request("フィールド名")”という書式を使うと,ユーザーが入力した情報を取得できるという表現は正確ではない。正しくは,WebのフォームがGETメソッドで送信されたならば“Request.QueryString("フィールド名")”,POSTメソッドで送信されたならば“Request.Form("フィールド名")”という書式を利用する必要がある。

 GETメソッドやPOSTメソッドとは,サーバーに対するデータ送信の方法である。Webフォームの<FORM>エレメント内にある“METHOD=”の部分で,どちらを使うのかを指定する。List 8-10に示した送信フォームでは,3行目にあるとおり“METHOD="POST"”となっており,データはPOSTメソッドで送信される。よって,List 8-11の3行目や4行目は,本来ならば“Request.Form("フィールド名")”と記述すべきである。

 GETメソッドとPOSTメソッドの違いは,データの表現方法にある。GETメソッドを使った場合,フォームに入力された送信データはURLの後ろに付加されて送信される。具体的には,“フィールド名=入力された値”という表記をURLエンコードして,“&”で区切って列挙したものである。たとえば,次のようなURLとなる。

http://サーバー名/wform.asp?
USERNAME=F.Osawa&
EMAIL=osawa@example.co.jp

※読みやすいように折り返してあるが実際は1行で表現される

 このURLは,送信したときにWebブラウザの[アドレス]などの欄に表示される。実際にどのような文字列になるのかは,List 8-10の3行目にある“METHOD="POST"”を“METHOD="GET"”に変更して送信してみれば,確認することができる(Fig.8-35)。表示されたURLは,Webブラウザ自身のキャッシュや,プロキシサーバーによるキャッシュの対象になる。

Fig.8-35 Webブラウザに表示されたGETメソッドのURL
fig8_35

 GETメソッドで使われるURLは,リンクとして利用することもできる。たとえば,次のようなリンクを挿入しておくと,フォームを使わなくてもユーザーがそのリンクをクリックしたときにASPファイルに指定した情報が送信される。

<A HREF="wform.asp?
USERNAME=F.Osawa&
EMAIL=osawa@example.co.jp">
リンク
</A>

※読みやすいように折り返してあるが実際は1行で表現される

 一方,POSTメソッドの場合には,URLの後ろにデータを付加するのではなく,HTTPを使って直接送信する。

 GETメソッドの場合,URLの後ろに“フィールド名=入力された値”などと値が付加されるため,送信できるデータの長さ(文字数およびバイト数)は,URLの最大長によって制限される。環境によっても異なるが,一般的には概ね1Kバイト以下のURLしか扱えない。それに対し,POSTメソッドでは送信する長さの制限はない。

 以上をまとめると,GETメソッドとPOSTメソッドは次のような指針で使い分けるのが賢いといえる。

GETメソッドを使うべきとき】

  • 送信する文字数が短いとき
  • 意図的にキャッシュさせたいとき
  • リンクを使いたいとき

POSTメソッドを使うべきとき】

  • 送信する文字列が長いとき
  • キャッシュさせたくないとき
  • 送信されるデータをURLとして見せたくないとき

 特にGETメソッドを使う場合には,生成されたURLがWebブラウザやプロキシサーバーのキャッシュに溜められることから,セキュリティホールにもなりかねないので注意したい。たとえば,ユーザー名とパスワードを送信するフォームにGETメソッドを使うと,URLエンコードされたユーザー名やパスワードが,利用されているプロキシサーバーのキャッシュに溜まる可能性があり,パスワード漏洩の危険が高まる。


One Point! だからといって,POSTメソッドを使えば安全だというわけではない。POSTメソッドを使っても暗号化されるわけではないから,ネットワークを盗聴されてしまえば結果は同じであり,単にキャッシュされるかどうかの問題だけである。より安全に通信したいのであれば,「8.3.2 SSLによる暗号化」で説明するように,暗号化通信を利用すべきである。

 GETメソッドとPOSTメソッドの違いはこのぐらいにして,ASPによるフィールド値の取得に話を戻す。

 すでに説明したとおり,ASPでフィールド値を取得するためには,“Resuest("フィールド名")”という表記を使えばよい。だが,ASPは,Request("フィールド名")という表記があったとき,それを次の順序でコレクションに置き換え,該当するフィールド名が見つかるまで調べる。

  • Request.QueryString("フィールド名")
  • Request.Form("フィールド名")
  • Request.Cookies("フィールド名")
  • Request.ClientCertificate("フィールド名")
  • Request.ServerVatiables("フィールド名")

 つまり,Request("フィールド名")と記述しておけば,先にRequest.QueryString("フィールド名")が調査され,そのあとにRequest.Form("フィールド名")が調査されるから,フォームの送信がGETメソッドであってもPOSTメソッドであっても,ユーザーから送信されたフィールドの値を正しく取得できることになる。

 しかし,これでは,状況によっては処理速度の低下に繋がるという点も考慮しなければならない。たとえば,POSTメソッドでフォームを送信しているList 8-10について考えてみよう。List 8-11のようにRequest("フィールド名")と表記してしまうと,まずRequest.QueryString("フィールド名")が調査される。先に説明したとおり,Request.QueryString("フィールド名")という書式はGETメソッドで送信したときのフィールド値を読み取る方法である。しかし,List 8-10POSTメソッドで送信されているので,これに該当するフィールドはない。つまり,無駄な検索をすることになるわけだ。よって,少しでも処理速度を向上させたい場合には,フォームを送信するメソッドの種類に応じて,GETメソッドであればRequest.QueryString("フィールド名")POSTメソッドであればRequest.Form("フィールド名"),と表記を使い分けたほうがよい。しかし,そのような表記の違いは煩雑になる側面もあるので,本稿中の説明ではメソッドの違いを考えず,統一的にRequest("フィールド名")という表記を使うことにする。

 ちなみに,Request.Cookiesはクッキー情報を取得するコレクション,Request.ClientCertificateはクライアント証明書情報を取得するコレクション,Request.ServerVariablesはサーバー情報を取得するコレクションである。Request.Cookiesコレクションについては「●クッキー情報の送受信」で,Request.ClientCertifiaceコレクションについては「8.3.3 クライアント証明書を使った認証」で,Request.ServerVariablesコレクションについては「○環境変数の取得」で,それぞれ説明する。

Prev 15/43 Next