2008/5/20 久米
コラム from投稿の仕組
※もちろんサーバAとBが同じサーバでもよい。
|
フォーム部品 |
|
PHP側で参照する時 | 渡された値 |
name="abc" value="100" |
POST→ |
$_POST['abc'] | "100" |
GET→ |
$_GET['abc'] | ||
どちらでも→ | $_REQUEST['abc'] |
※[ ]の中の['abc']は、["abc"]でもよい
確認例
ファイルform01.htm | ファイルform01.php | |
<form method="post" action="form01.php"> <p>メッセージ<input type="text" name="message" value=""></p> <p> <input type="submit" name="sub" value="投稿"> <input type="reset" name="reset" value="クリア"> </p> </form> |
→ | <?php print "変数messageの値は ".$_POST['message']."<br>"; print "変数subの値は ".$_POST['sub']."<br>"; ?> |
演習1 下記それぞれのフォーム部品を受取ってプリントするform02.phpファイルを作りましょう。
テキスト枠 | ユーザ名:<input type="text" name="name"><br> |
パスワード枠 | パスワード:<input type="password" name="pass"><br> |
hiddenフィールド | <input type="hidden" name="hidden_value" value="練習"><br> |
ラジオボタン | <input type="radio" name="seibetu" value="男">男の子 <input type="radio" name="seibetu" value="女">女の子 |
チェックボックス | <input type="checkbox" name="ok" value="可">メールマガジン受信可 |
セレクト | 住所:<select name="jusho"> <option value="東京" selected>東京</option> <option value="神奈川">神奈川</option> <option value="埼玉">埼玉</option> </select> |
テキストエリア | <textarea name="message" cols="70" rows="5"></textarea><br> |
サブミットボタン | <input type="submit" name="sub" value="登録"> <input type="submit" name="sub" value="取消"> |
form投稿を受け取るphpファイル(例form01.php)を直接開くとエラーになる。
これはformで値がなにも飛んでこないのに$_POSTで値を読み込もうとするからです。
これを防ぐには、下記一文を$_POSTを処理する前に入れておく。
if(!isset($_POST['sub'])){//submitボタン属性が設定されていない場合。つまりformの値がない場合。 exit("アクセスエラーです。");//phpファイルを直接開いたので「アクセスエラー」と表示し処理中断。 } |
演習2 貴方はDALL社のサイト管理者です。
1) PCトラブル相談センターのページをformタグで作成してください。(自由に)
2)送信ボタンを押したら、この内容でいいですか?という確認のためのページを送り返してください。
指定方法 | 説明 | 備考 | |
POST | method="post" | 内部的に渡す | 通常はこちらを使用しましょう。 |
GET | method="get" | URLに付加して渡す | http://URL?データ名1=値1&データ名2=値2& |
GETのいい点は、リンクで飛ばすことができること。(演習3、4)
演習3 下記リンクをクリックしたら、それを受信してプリントするスクリプトを記述せよ。
<a href="form03.php?best1=php&best2=actionscript&best3=javascript">好きなスクリプト</a>
演習4 下記リンクをクリックしたら、それを受信して商品を説明するスクリプトを記述せよ。
<a href="form04.php?no=1">おいしい北海道産カニ</a>
<a href="form04.php?no=2">ほくほく鹿児島産石焼き芋</a>
<a href="form04.php?no=3">つるつる越前ソバ</a>
どちらでページを開いたか? | 処理 |
普通にページを開いた場合 | フォーム部品を表示 |
submitボタンを押して呼び出した場合 | フォーム部品で入力された値を処理 |
例 注1の考えを応用
if(isset($_POST['sub'])){//submitボタン属性が設定されているか? //submitボタンを押して呼び出したので //フォーム部品で入力された値の処理 } |
演習5 下記フォーム部品投稿したら、各変数をprintするような、自分自身を呼び出すphpページを作成せよ。
(レイアウトなどは適当に変えていいです)
<form action="enshu5.php" method="post"> 名前:<input type="text" name="name" value="" id="name"><br> E-Mail:<input type="text" name="mail" value="" id="mail"><br> タイトル:<input type="text" name="title" value="" id="title"><br> 本文:<br> <textarea name="body" ROWS="5" COLS="70" id="body"></textarea><br> URL(http://から記入):<input type="text" name="url" value="" id="url"><br> <input type="submit" name="sub" value="投稿"> <input type="reset" value="クリア"> </form> |
参考 得得情報
action="<?php print htmlspecialchars($_SERVER['PHP_SELF']); ?>"
とすればファイル名は書かなくてよい。
参考の参考 $_SERVER['PHP_SELF']とXSS脆弱性
コラム デフォルトでregister_globals=On
|
http://example.com/foo.phpの中のプログラム if($user_assword === "runrun") $valid = 1; if ($valid === 1) //以下認証成功した時の処理 |
上記例は$valid=0;の初期化をしていない。
心得のあるプログラマは初期化をするのであるが・・・ 忘れたのかもしれない。
悪意のある利用者が、なんらかの手段で$valid変数の存在を知った場合、
上記プログラムの認証は突破できる。
http://example.com/foo.php へのアクセス時に
?valid=1 を書き足して
http://example.com/foo.php?valid=1
でアクセスすることにより、認証成功と同じ結果を得ることができてしまう。
参照 グローバル変数の登録機能の使用法
※よって参考書最速Webシステムのp307のphp.iniは書き直さない方がベターでしょう。