PHPでのフォームの内容解析について

| PHP

最近、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( “<” , “&lt;” , $_POST[“name”])」等を使ってタグを消したり、PHPプログラムを実行されたりしないように対処しておいた方が良いと思います。
(本格的に対策はどうしたらいいの?という記事は気が向いたら書きます)

正規表現で英数字以外が使われているかどうか調べる

正規表現で英数字以外が入力されていることをチェックするには以下の方法を使います。

英数字のみ利用可能なアカウントとか同じく英数字のみ入力を許可しているパスワードの入力内容をチェックするための方法。

if ( preg_match("/[\W_]/", $check_strings) {
  // 英数字以外の入力があった場合の処理
}

1行目の「[\W]」は「[^0-9a-zA-Z_]」と同じ意味です。

「[\W]」だけで英数字と’_’以外を見つけ出すのですが、今回は’_’も見つけてほしいので「/[\W_]/」という書き方にしています。

トラックバック

トラックバックURL:

トラックバック & ピンバック

コメントはまだありません。

作ったもの

種牡馬メモサイト

フリーダムウォーズ素材メモサイト

月別アーカイブ

つぶやき

更新記録カレンダー

2019年11月
« 1月    
 123
45678910
11121314151617
18192021222324
252627282930  

参考書籍

XHTML/HTML+CSSスーパーレシピブックXHTML/HTML+CSSスーパーレシピブック
エ・ビスコム・テック・ラボ

毎日コミュニケーションズ
売り上げランキング : 74419

Amazonで詳しく見る
現場のプロから学ぶXHTML+CSS現場のプロから学ぶXHTML+CSS
益子 貴寛,堀内 敬子,小林 信次,千貫 りこ,伊藤 学,山田 あかね,西畑 一馬,CSS Nite

毎日コミュニケーションズ
売り上げランキング : 39400

Amazonで詳しく見る