最近、PHPでのフォームのポストで送られてきたデータの解析をやっていて思うことがあるので記事に残しました。
HTML+PHPでサーバーアプリを作っていてよく使う?内容についてのメモ
初心者、入門レベルが備忘録に書いた記事です。。
ページの目次
内容の全解析
開発中のデバッグ向けに内容を全解析する方法
POSTの内容解析
print "[POST]<br />\n"; foreach ( $_POST as $key => $val ) { print "$key = $val<br />\n"; }
GETの内容解析
print "[GET]<br />\n"; foreach ( $_GET as $key => $val ) { print "$key = $val<br />\n"; }
COOKIEの内容解析
print "[COOKIE]<br />\n"; foreach ( $_COOKIE as $key => $val ) { print "$key = $val<br />\n"; }
サーバー情報の内容解析
print "[SERVER]<br />\n"; foreach ( $_SERVER as $key => $val ) { print "$key = $val<br />\n"; }
データチェック
初心者レベルの話から少しだけステップアップして単純な話だけどいたずら対策
送られてきたデータのチェック
例えば、以下のようなフォームを作ったとします。
<html> <head><title>データを送るよ~</title></head> <body> <form type="POST" action="post.php"> 名前を入力してね: <input type="text" name="name" /> </form> </body> </html>
受け取るPHPのソースはこんな感じ。
<html> <head><title>データを受け取るよ~</title></head> <body> <?php print "あなたの名前は". $_POST["name"]. "さんですね。<br />\n"; ?> </body> </html>
perlを使っていた人間からすると忘れがち?だけど、5行目のハイライトしている行はそのままだとPHPではエラーになります。
当たり前ですが、「form_post.html」から素直に来た人はエラーになりません。「post.php」に直接アクセスしてきた人がエラーになります。エラーの内容は「Notice: Undefined index:~」という表示で宣言されていない変数にアクセスした場合に出るエラーです。
「そんな直接アクセスしてきた人なんて知らないよ~・・・」と言ってしまえばそこまでなのですが、そうもいかないケース・・・例えばユーザーがブックマークしたりするケースがあると思います。そのような場合は「isset」を使ってPOSTされた内容が有効なのかどうか調べて分岐すると良いと思います。
<html> <head><title>データを受け取るよ~</title></head> <body> <?php if ( isset($_POST["name"]) ) { print "あなたの名前は". $_POST["name"]. "さんですね。<br />\n"; } else { print "さきに<a href=\"form_post.html\">こちら</a>で名前を入力してください。<br />\n"; } ?> </body> </html>
さらに、今回のケースは入力内容が1つしかなかったので上記のようなソースコードにしましたが、複数の入力内容(例えば、「名前(name)」と「年齢(age)」と「住所(address)」と「職業(job)」)をチェックする必要がある場合は以下のようにすると一気にチェックが可能です。(PHPソースの部分だけ抜粋します)
<?php // POSTで送られてきたデータが全て存在するかチェックする処理 function PostCheck($arrayKey) { foreach ( $arrayKey as $key ) { if (! isset( $_POST[$key] ) ) { // 入力内容が見つからない return false; } } // 成功 return true; } // 入力元のフォームで使用しているプロパティの全てを入力する $arrayPostKey = array( "name", "age", "address", "job" ); if ( PostCheck($arrayPostKey) ) { print "あなたの名前は". $_POST["name"]. "さんですね。<br />\n"; print "現在". $_POST["age"]. "歳<br />\n"; print $_POST["address"]. "に住んでいる".$_POST["job"]. "さんですね。<br />\n"; print $_POST["address"]. "は、良いところですよね。(適当)<br />\n"; } else { print "さきに<a href=\"form_post.html\">こちら</a>で入力を行ってください。<br />\n"; } ?>
ただ、上のコードはセキュリティ的に色々まずいです。
ハッカーからすると色々実行できてしまいますので・・・「str_replace( “<” , “<” , $_POST[“name”])」等を使ってタグを消したり、PHPプログラムを実行されたりしないように対処しておいた方が良いと思います。
(本格的に対策はどうしたらいいの?という記事は気が向いたら書きます)
正規表現で英数字以外が使われているかどうか調べる
正規表現で英数字以外が入力されていることをチェックするには以下の方法を使います。
英数字のみ利用可能なアカウントとか同じく英数字のみ入力を許可しているパスワードの入力内容をチェックするための方法。
if ( preg_match("/[\W_]/", $check_strings) { // 英数字以外の入力があった場合の処理 }
1行目の「[\W]」は「[^0-9a-zA-Z_]」と同じ意味です。
「[\W]」だけで英数字と’_’以外を見つけ出すのですが、今回は’_’も見つけてほしいので「/[\W_]/」という書き方にしています。
トラックバック & ピンバック