| ホームページを作るにはどうすればよいのか? ファイル転送・SSL・メール送信の仕組み・CGIなどをやさしく解説します |
![]() |
| トップページ | インフォメーション | プロフィール | 更新履歴 | メルマガ | お問い合わせ |
ホームページの改ざんを防ぐには? その2
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ■ホームページの改ざん対策(2) | ||||
| データの受け渡しに、hidden項目を使うことがあります。 | ||||
| hidden項目を使えば、ホームページ上にデータを表示させないまま、目的のページまでデータを運ぶことができます。 | ||||
| しかし、ソース表示で見ることができるため、書き換えられるおそれがあります。 | ||||
| 今回、事例としてあげるのは、hiddenを使って会員情報を区別しているホームページです。 | ||||
| 会員の種類は、シルバー会員にはじまり、ゴールド、プラチナと、次第に得られる特典も大きくなっていくものと | ||||
| します。 | ||||
| ログイン画面から、会員IDとパスワードを入力すると、会員ページへ入れる……という仕組みになっています。 | ||||
![]() |
||||
| シルバー会員であれば、シルバー会員用のメニューしか見れませんし、シルバー会員用の情報しか閲覧 | ||||
| できません。 | ||||
| 1.ログイン画面 | ||||
![]() |
||||
| 2.シルバー会員用メニューへ | ||||
![]() |
||||
| 3.シルバー会員専用情報へ | ||||
![]() |
||||
| これが普通の使い方です。 | ||||
| これから、ゴールド会員用のパスワードを打ち込まずに、ゴールド会員用のページを表示さてみます。 | ||||
| 4.直入力を試みる | ||||
| その前に、直アドレスの打ち込みがブロックされていることを確認します。 | ||||
| ログイン画面のURLに、information.php までのフルパスを入力してみました。すると……。 | ||||
![]() |
||||
| 5.直入力はブロックされている | ||||
![]() |
||||
| 会員登録への案内がでました。URLの直接入力については、対処済みというわけです。 | ||||
| このホームページでは、次のような処理を記述してあります。 | ||||
| hiddenに値が入っていた場合 → 該当する会員ページへ | ||||
| hiddenに値が入っていなかった場合 → 会員登録の案内を表示 | ||||
| では、これから送信情報に手を加えることにしましょう。 | ||||
| 6.「ソース」を表示させる | ||||
| あなたはシルバー会員です。もうひとつ上の情報を見てみたいな……と思っています。 | ||||
| では、会員用メニュー画面で、「ソース」を表示してみましょう。 | ||||
![]() |
||||
| あくまで事例ですので、簡単に書いてあります。 | ||||
| hidden項目の行を見てください。 | ||||
| NAME='MEMBER' VALUE='1' という記述があります。 | ||||
| どうやら、このあたりが臭そうです。 | ||||
| 7.ページを書きかえる | ||||
| ACTION の指定をフルパス表記にして、hidden 項目の値を2にします。 | ||||
![]() |
||||
| 変更したら保存します。保存する場所は、あなたのパソコンのディスクトップ(どこでも構いません)です。 | ||||
| 8.作成したファイルを開く | ||||
| ディスクトップに保存したさきほどのファイルを開きます。 | ||||
| URLはローカルファイルであることを指定しています。 | ||||
![]() |
||||
| 9.情報ページへ | ||||
| ボタンを押してみましょう。見事、ゴールド会員のページへ行けました。 | ||||
| 本来なら見れないページです。また、サーバー内のページ(ファイル)を書きかえたわけでもありません。 | ||||
![]() |
||||
| hidden項目を使っているページはたくさんありますが、事例のように NAME='MEMBER' で、VALUE の値が | ||||
| 数値だということは、そうないと思います(これだと、そのまんま)。 | ||||
| hidden項目での値のやりとりは、危険性をはらんだものであると考えてください。 | ||||
| VALUE値を変更して、ACTION指定をフルパス表記にすればよいのです。 | ||||
| たったこれだけの作業で、サイトのセキュリティが崩れかねないのですから。 | ||||
| hidden項目をうかつに使えないのは分かりました。では、代わりになるものはないのでしょうか? | ||||
| ひとつの解決策として、セッション変数を使う方法があります。 | ||||
| TOPページへ | ||||
|
|
||||
| 事例はPHPで構築されています(ログイン画面は html ファイルです)。 | ||||
| 参考までにソースを記しておきます。 | ||||
| logon.html <html><title>ログイン画面</title> <body> ログイン画面 <Form Method="POST" Action="kaiin_page.php"> ユーザー名:<Input Type="text" Name="user"><br> パスワード:<Input Type="text" Name="Password"><br> <Input Type="Submit" Value="ログイン"> </Form> </body> </html> |
||||
| menu.php <?php $strUser = $_POST['USERID']; $strPass = $_POST['PASSWORD']; If ($strUser == "silver" and $strPass == "pass") { $strMember = "1"; }ElseIf ($strUser == "gold" and $strPass == "pass"){ $strMember = "2"; }ElseIf ($strUser == "platinum" and $strPass == "pass"){ $strMember = "3"; }Else{ $strMember = "0"; } If ($strMember == "1") { print "<html><title>シルバー会員用ページ</title>"; print "<body>"; print "シルバー会員用メニュー<BR>"; print "<FORM METHOD='POST' ACTION='information.php'>"; print "<INPUT TYPE='HIDDEN' NAME='MEMBER' VALUE='1'>"; print "<INPUT TYPE='RADIO' NAME='INFORMATION' VALUE='1' CHECKED>情報その1<BR>"; print "<INPUT TYPE='RADIO' NAME='INFORMATION' VALUE='2'>情報その2<BR>"; print "<INPUT TYPE='SUBMIT' VALUE='読む'><BR>"; print "</FORM>"; print "</body>"; print "</html>"; }ElseIf ($strMember == "2"){ print "<html><title>ゴールド会員用ページ</title>"; print "<body>"; print "ゴールド会員用メニュー<BR>"; print "<FORM METHOD='POST' ACTION='information.php'>"; print "<INPUT TYPE='HIDDEN' NAME='MEMBER' VALUE='2'>"; print "<INPUT TYPE='RADIO' NAME='INFORMATION' VALUE='1' CHECKED>情報その1<BR>"; print "<INPUT TYPE='RADIO' NAME='INFORMATION' VALUE='2'>情報その2<BR>"; print "<INPUT TYPE='SUBMIT' VALUE='読む'><BR>"; print "</FORM>"; print "</body>"; print "</html>"; }ElseIf ($strMember == "3"){ print "<html><title>プラチナ会員用ページ</title>"; print "<body>"; print "プラチナ会員用メニュー<BR>"; print "<FORM METHOD='POST' ACTION='information.php'>"; print "<INPUT TYPE='HIDDEN' NAME='MEMBER' VALUE='3'>"; print "<INPUT TYPE='RADIO' NAME='INFORMATION' VALUE='1' CHECKED>情報その1<BR>"; print "<INPUT TYPE='RADIO' NAME='INFORMATION' VALUE='2'>情報その2<BR>"; print "<INPUT TYPE='SUBMIT' VALUE='読む'><BR>"; print "</FORM>"; print "</body>"; print "</html>"; }Else{ print "<html><title>エラー情報</title>"; print "<body>"; print "会員IDまたはパスワードが違います。<BR>"; print "</body>"; print "</html>"; } ?> |
||||
| TOPへ戻る | ||||