今回から,いよいよPHPによるWebアプリケーション開発を始めます。第3回に紹介した手順のうち,2.から先を実践していきます。
実行環境として,ここではPHP言語とApacheサーバが一括してインストールされるXAMPPを用いることとします。ダウンロード後にインストーラを起動すれば,PHP, Apache(Webサーバ), MySQL(データベース)を一括してインストールできますので,第2回で紹介した手順でどうしてもうまくいかないときには,こちらを検討してみてください。ただし執筆時点で最新版のバージョン1.6.4に同梱されるPHP処理系はバージョン5.2.4となります。
これから作成するWebアプリケーション
今回作成するWebアプリケーションは,図1のようにフォームに文字列を入力して「表示する」をクリックすると,メッセージがフォームの下に出力されるというものです(図2)。このように,入力されたものと同じ内容を表示(出力)することをエコー(echo)といいます。
ソースコードの作成
まずはテキストエディタもしくは開発環境でソースコードを作成します(リスト1)。保存するときは文字コードはUTF-8としておきます。保存する文字コードの種類によっては,処理系の設定が必要になることがあります。
リスト1 フォームに入力された内容をエコーするWebアプリケーション(phpapp01.php)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>PHPによるWebアプリケーション(エコー)</title>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
</head>
<body>
<h3>PHPによるWebアプリケーション(エコー)</h3>
<form method="post" action="<?php print $_SERVER[ 'PHP_SELF' ]; ?>"><p>
<input type="text" name="echo" size="50">
<input type="submit" value="表示する">
</p></form>
<p><?php print htmlspecialchars( $_POST['echo'], ENT_QUOTES ); ?></p>
</body>
</html>
リスト1内のPHPプログラムは,<?php ~ ?>で囲まれている2つの部分です。それ以外はPHPプログラムの実行結果には関係なくWebブラウザに送信され,画面表示に用いられます。両者は表記上は分断されてしまっていますが,図1から図2に至る処理を実行する上では一体のPHPプログラムです。
リスト1で<?php ~ ?>に囲まれている部分
-
(a)
<?php print $_SERVER['PHP_SELF']; ?>
このWebページのURL(変数)を出力 -
(b)
<?php print htmlspecialchars( $_POST['echo'], ENT_QUOTES ); ?>
フォームの下に表示される文字列(関数の戻り値)を表示
ここで(a)(b)は変数や関数の戻り値を表示(出力)する処理です。(a)は画面表示には現れないものの,「表示する」がクリックされたときにフォームに入力されたデータを送信する先を表すURLとして認識されます。
(b)は,フォームから入力された内容に対して,関数によって処理を加えてから画面に表示させています。その理由を説明します
文字列を表示させるときの注意
フォームから入力された内容をそのまま表示させることには,問題があるとされています。それは,フォームから入力されたHTMLタグやJavaScriptなどのスクリプトを実行してしまう恐れがあるからです。これを「クロスサイトスクリプティング(XSS)※」といいます。
- ※ ウェブサイトにおける脆弱性解説 2.クロスサイト・スクリプティング (独立行政法人 情報処理推進機構)
これの何が問題かというと,スクリプトが実行されることで,ユーザが意図しないところで,セキュリティに関わる情報が漏洩してしまう危険性があることです。
このような事態を防ぐための最も基本的な方法は,いくつかの記号の表記を変換するというものです。それを行うのがhtmlspecialchars()関数です。この関数で変換される記号の表記を表1に示します。
表1 htmlspecialchars()関数により変換される記号の表記
| ' | ' |
| " | " |
| < | < |
| > | > |
ただ,セキュリティの問題はこれだけで防げるわけではなく,実際の開発ではより複雑な対策が行われます。

