連載
» 2014年07月02日 18時00分 UPDATE

Web業界で働くためのPHP入門(8):GET/POSTでフォームから送信された値をPHPで受け取る際のセキュリティ対策 (2/2)

[山口晴広,株式会社イメージズ・アンド・ワーズ]
前のページへ 1|2       

POSTメソッドの例

 POSTメソッドの場合は送信するフォームが必要になります。フォームを表示するHTMLと、送信先となるPHPの2つにファイルを分けてもいいのですが、ここでは1つのPHPファイルとしてサンプルを作ってみることにします。

 サンプルは、送信された2つの数値を足し算して表示するという、ごく簡単なものとします。段階を追って作っていきましょう。まずはフォームです。

<form action="" method="post">
  <input type="text" name="num1" size="4"> +
  <input type="text" name="num2" size="4">
  <input type="submit" value=" = ">
</form>

 これを表示すると次のようになります。

php8_03.jpg 図3 足し算をするフォームの表示。足し算っぽく表示してみた

 フォームの送信先URLは空になっています。空のままでも当該ファイル自身が送信先になりますが、ここでは明示することにしましょう。ファイル自身は、$_SERVER配列のSCRIPT_NAME要素として格納されていますので、次のようになります。

<form action="<?php echo $_SERVER['SCRIPT_NAME'] ?>" method="post">
  <input type="text" name="num1" size="4"> +
  <input type="text" name="num2" size="4">
  <input type="submit" value=" = ">
</form>

 ブラウザーのHTMLソース表示機能を使って確認してみてください。

 次に、値が送信されていた場合に足し算を行って表示する部分を追加します。値が送信されたということは、$_POSTに何か値が入っているということです。配列が空かどうかは、if文で比較する(すなわち、真偽値へ型変換する)と、空の場合は偽となるので判定できます。

<form action="<?php echo $_SERVER['SCRIPT_NAME'] ?>" method="post">
  <input type="text" name="num1" size="4"> +
  <input type="text" name="num2" size="4">
  <input type="submit" value=" = ">
</form>
<?php
if ($_POST) {
    $num1 = $_POST['num1'];
    $num2 = $_POST['num2'];
    echo $num1, ' + ', $num2, ' = ', $num1 + $num2;
}
?>

 これを表示し、フォームに数字を入力してボタンを押すと、次のようになります。

php8_04.jpg 図4 足し算が実行されて表示されたところ

 <input>要素のvalue属性に入力された値を入れて表示すれば、もっときれいに表示することもできるでしょう。ぜひ挑戦してみてください。

コラム「フォームの名前に『[]』を使うと、PHP上では配列として格納される」

 フォームの名前に「[]」を使うと、PHP上では配列として格納されます。これは他の言語にはない特徴です。例えば、次のようなフォームから送信すると、$_POST['foo']に2つの要素を持つ配列が格納されます。

<form action="" method="post">
  <input type="text" name="foo[1]"><br>
  <input type="text" name="foo[2]">
  <input type="submit" value="送信">
</form>

フォーム送信時に必要なセキュリティ対策「サニタイズ」

 今回のサンプルプログラムは、あくまで解説のためのサンプルです。テストサーバー上で、PHPを理解するために試行錯誤する分には問題ありませんが、実際にWebサーバー上で公開してはいけません。

 PHPに限らず、どのようなプログラムでもいえることですが、外部からの入力は、何らかの悪意をもって行われる可能性を常に考慮に入れなければならないためです。悪意というのはセキュリティを侵害したり、誤動作や停止させたりといったことです。サンプルプログラムは、そういった考慮を一切していません。

 例えば、認証のためにフォームから送信されたパスワードをデータベースに問い合わせる、といった典型的な処理がありますが、その際、送信値をそのままデータベースに渡すことはご法度です。データベースで使われる特殊な文字を意図的に(悪意を持って)使うことで、どのようなパスワードでも認証を通すことが可能になってしまいます。

 こういった攻撃は「SQLインジェクション」と呼ばれますが、防ぐための1つの方法として、特殊な文字を取り除いたりエスケープしたりといった対応があります。こういった処理を「サニタイズ」といいます。「消毒する」「無害化する」という意味です。

 肝に銘じてほしいのですが、フォーム送信値は、用途に沿ってサニタイズし、キレイにしてから使わなければなりません。

 Webアプリケーションの場合、もう一つ注意しなければならないことがあります。ブラウザーに返すHTMLに変数の内容を表示する場合です。HTML上の特殊文字である「<」「>」「&」をエスケープして表示しなければなりません。エスケープをしないとHTMLのタグとして認識されてしまいます。

 特に、フォーム送信値をそのままエスケープせずに表示してしまうと、任意のタグを表示できることにつながってしまいます。

次回は、PHPの関数について

 サニタイズやHTMLエスケープの具体的な方法については、本連載では解説しませんが、実際のWebアプリケーションを公開する場合は必須の対策であることを覚えておいてください。サニタイズやSQLインジェクション対策について知りたい方は下記記事も参照してください。

 次回は関数について解説します。

著者紹介

株式会社イメージズ・アンド・ワーズ
代表取締役
山口晴広(やまぐち はるひろ)


前のページへ 1|2       

Copyright© 2014 ITmedia, Inc. All Rights Reserved.

TechTargetジャパン

メルマガ購読キャンペーン

ホワイトペーパー(TechTargetジャパン)

注目のテーマ

転職/派遣情報を探す

【転職サーチ】SIer/Web企業/新規事業 スマホ開発で、あなたのキャリアを生かす

「派遣・フリーで働くメリット」とは? 活躍する派遣エンジニアの本音

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。