メールフォームの作成

2007.06.26 Author: Jas

研修期間も終わりに近づき、簡単な実案件を任されるようになってきました。
簡単な実案件=メールフォーム・・・最近はひたすらメールフォームばかり作っているような気がします。

案件ごとに項目数や項目内容、入力チェック項目などの仕様が変わるとはいえ、基本的には同じものを作っているので、毎回同じようなバグを出すわけにはいきません。回数を重ねるごとにバグの少ないメールフォームを作成し、最後にはバグのない状態でデバッグ屋さんに提出したいものです。

そこで、今回は「エンジニア泣かせのデバッグ」に対抗し、開発側の立場から今までの失敗点や注意点を振り返って、フォーム作成時のバグ撲滅対策を考えてみようと思います。

まず、フォームを作成する前に案件ごとの仕様を確認する必要があります。
ここで必須項目や入力形式、文字数制限、フォームのテンプレート、メールの送信先などをよく確認しましょう。仕様が確認できたらスクリプトを作っていきます。

一番面倒なのは入力チェックの作業。。。
入力項目数が多かったり、相互に関係のある項目があったりすると、チェック項目がどんどん多くなっていきます。利用者的にも、開発者的にも、入力項目はなるべく少なくしてほしいところですが、勝手に変えるわけにもいかないので仕様に沿って開発していきましょう。

必須項目入力チェックは当たり前ですが、必須項目でなくても文字列が入る可能性のあるところ(すべてのテキストエリア&テキストボックスからの入力値が対象です!)は、文字化けの原因となる機種依存文字や半角のカナが含まれていないかどうかもちゃんとチェックしましょう。

次は入力形式のチェックと数値などの適正検査です。
メールアドレスや電話番号、郵便番号など入力形式が決まっている値は、正規表現などを用いて入力検査を行いましょう。さらに、日付や年齢など範囲の決まった数値が入力される場合には注意が必要です。2月30日や999歳と書き込まれても、入力チェックをクリアしないように、入力値の範囲が適正かどうかもチェックしましょう。
日付の適正検査にはPHPのcheckdate()関数が便利ですが、この関数では年の範囲が1 から 32767であれば適正になってしまうので、必要に応じて年の適正範囲を制限する必要があります。(例えば、現在から2037年までならOKとかですね。)

無事に入力チェックをクリアできたら確認画面を経て、送信できるようにページを組み立てていきましょう。このときに、「入力→確認→送信」の単純なページ遷移だけでなく、送信をリロードしたり、前のページに戻ったりする場合も想定してスクリプトを書く必要があります。送信画面をリロードすることで何通もメールが送られるようでは困りますからね。

次に、確認画面への出力加工処理です。
ここで忘れてはいけないのがタグの無効化処理。
フォームからの入力値にhtmlやJavaScript等が含まれていたら大変です。
htmlの場合はサイトデザインが崩れる原因になりますし、JavaScriptだともっと大変でクロスサイトスクリプティング(XSS)を許してしまうことになります。すべてのテキストエリア&テキストボックスからの入力値は、PHPのhtmlspecialchars()かSmartyのescapeを使ってタグの無効化をしておきましょう。

画面出力で注意が必要なのが予想外に長い文字列を入力された時の対応。
メールで送信できる文字列にも上限があるでしょうし、そうでなくても英数文字を区切りなくたくさん続けて入力すると、折り返されずに一行で表示されたりするためサイトのデザインを壊してしまう危険があります。適切に文字数制限をするなり、折り返し処理をしたほうがよいでしょう。

最後に、PHPの設定も確認しておきましょう。マジッククォートがONになっているときには、バックスラッシュエスケープを取り除く処理が必要です。これはPHPのstripslashes()で処理できます。

あとはデータの送信テストを行い、文字化けなくメールの送信や投稿データのファイル保存などができればフォームの完成です。

「フォームにJavaScriptを入力」や「英数文字を区切りなくたくさん続けて入力」なんて書くと、普通はそんな書き込みはしないと思うかもしれませんが、フォームにはだれが入力しに来るかわかりません。
なので、いたずらをされても被害を最小限にとどめ、サイトデザインが破壊されたり、セキュリティの問題が起きないようなスクリプト設計をすることが大切です。

デバッグ屋さんもいじわるがしたくて、予想外の文字列入力やページ遷移を繰り返しているわけではなく、バグのないよいシステムを作るためにあえて攻撃者の気持ちでテストをしてくれているのです。
開発側もバグが少なくなるように、一度指摘されたバグは二度と出さないよう、記録に残したりして次回に活かしていきたいです。

名古屋のWebシステム開発・ネットワーク構築会社 コネクティボへ