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

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

オープンソースのWeb開発向けスクリプト言語「PHP」の文法を一から学ぶための入門連載。最新版の5.5に対応しています。今回は、HTMLのフォーム機能についておさらいし、get/postメソッドなどの内容を連想配列で格納するPHPの「定義済みの変数」の中身や、Webアプリ開発で欠かせないサニタイズについて解説。

[山口晴広,株式会社イメージズ・アンド・ワーズ]
本連載「Web業界で働くためのPHP入門」のインデックス

連載目次

 今回はPHPならではの機能、フォームの取り扱いについて解説します。厳密にいえば、これは本連載の目的である文法的な範囲の話ではありませんが、PHPを理解する上で欠かせないため、ざっと解説することにします。

 ところで、本連載ではPHP 5.5を前提としていますが、そろそろ5.6が正式リリースされそうです。現在のところ、リリース候補(RC)である5.6.0RC1が公開されています。5.6リリース後は、いずれどこかのタイミングで5.6系に移行したいと考えています。5.5系は5.5.14がリリースされていますので、アップデートしておきましょう。

HTMLのフォーム機能についておさらい

 HTMLのフォーム機能については既にご存じの読者も多いと思いますので、ここでは簡単なおさらいにとどめます。フォームとは<form>要素を使って、Webサーバーにデータを送信するための、HTMLとWebブラウザー側の仕組みです。

 例えば、次のようなHTMLをWebブラウザーで表示すると、1つの入力欄と送信ボタンが表示されます。

<form action="送信先URL" method="post">
  <input type="text" name="example">
  <input type="submit" value="送信">
</form>

 入力欄に何か入力してボタンを押すと、Webブラウザーは指定したURLに対して入力内容を送信します。通常そのURLでは何らかのWebアプリケーションが動作していて、入力内容に従って動作するように作られています。例えば、検索エンジンなら検索結果を表示する、などです。

PHPの「定義済みの変数」

 PHPの便利なところは、この送信先のURLにPHPのファイルを指定するだけで、Webブラウザー上のフォームから送信された値を受け取ることができる点です。

 「定義済みの変数」というあらかじめ決められた変数群があり、この変数に送信値が格納されています。つまり、変数にアクセスするだけで送信値を取り出せるようになっています。

 これまでの解説では、変数は何らかの値を代入することで使えるようになりましたが、定義済みの変数は、そういった操作をせず、いきなり使える点が異なっています。

 定義済みの変数はいくつか種類があり、フォームの送信値以外の目的でも使われています。よく使われるのは次のものです。

定義済みの変数 概要
$_GET getメソッドにより送信された値
$_POST postメソッドにより送信された値
$_COOKIE クッキーの値
$_REQUEST $_GET、$_POST、$_COOKIEをまとめたもの
$_SERVER サーバーの環境情報やクライアント(Webブラウザー)の情報
$_SESSION セッションに格納した値

 全て変数名の冒頭に「_(アンダースコア)」が付いていますが、これは「通常の変数ではない」ということを主張しています。特に、文法上のルールがあるわけではありません。通常のものとは違うという主張をするためにアンダースコアから始まる名前を付けることは、PHP以外の言語でもよく行われています。

 上記のうち、$_GETと$_POSTがフォームから送信された値が格納される定義済みの変数です。いずれの変数も連想配列になっています。

 例として、$_SERVERの内容を見てみましょう。$_GETや$_POSTはフォームから送信しないと空っぽですが、$_SERVERなら常に値が格納されています。

 次のコードで$_SERVERを表示してみましょう。

<pre><?php var_dump($_SERVER) ?></pre>

 結果は次のようになります。

php8_01.jpg 図1 定義済み変数の$_SERVERの内容をvar_dump()で表示したところ

 連想配列として、さまざまな情報が格納されていることが分かります。$_SERVER内の要素の意味は、「PHP: $_SERVER - Manual」で解説されているので、参考にしてください。

定義済みの変数「$_GET」「$_POST」の中身を見てみよう

 フォームにはGETメソッドとPOSTメソッドの2種類があり、それぞれ定義済みの変数、$_GETと$_POSTに対応しています。このメソッドはHTML上で<form>要素のmethod属性として指定するものです。

GETメソッドの例

 GETとPOSTの違いは、GETメソッドの場合、送信値はURLに連結した形で送信されるということです。URLの一部になっているため、送信する値を含めてブックマークしたり、リンク先を保存したりといったことが可能になります。

 get_dump.phpとして次の内容を保存し、ブラウザーで「http://localhost:8000/get_dump.php」にアクセスしてみましょう。

<pre><?php var_dump($_GET) ?></pre>

 何も送信していないため、$_GETは空です。「array(0){}」と表示されたことでしょう。次に下記URLにアクセスしてみます。「?」から右側がURLに追加した文字列です。

http://localhost:8000/get_dump.php?key1=abc&key2=xyz
php8_02.jpg 図2 GETメソッドによる値の送信はURLを介して行われている

 $_GETの中に、URLに追加した文字列が格納されていることが分かります。

 GETメソッドで追加する文字列の規則は例を見ればだいたい分かると思いますが、「?」「&」「=」といった区切りに使われている文字列を値に使いたい場合どうするかという疑問が生じることと思います。

 こういった特殊な文字は「URLエンコード」という変換をする必要があります。詳しくは各自調べてみてください。

       1|2 次のページへ

Copyright© 2014 ITmedia, Inc. All Rights Reserved.

TechTargetジャパン

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

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

注目のテーマ

転職/派遣情報を探す

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

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

RSSについて

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

メールマガジン登録

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