libro
www.tuyano.com
初心者のためのPHPプログラミング入門

フォーム送信の基本をマスターしよう (3/5)

作成:2010-12-04 14:38
更新:2010-12-04 14:38

■セキュリティ対策の第一歩

フォームを送信してサーバーで処理する、という「サーバーサイド・プログラミング」の第一歩を踏み出したあなたが、次に行うべきは何でしょうか? それは「今作ったプログラムの『穴』を塞ぐこと」です。

サーバーにプログラムを用意する、ということは、不特定多数の人がそのサーバーにアクセスし、そのプログラムが実行される、ということになります。つまり、そのサーバーにアクセスするあらゆる人に対し、「そのプログラムが安全に動く」ことを保証する義務が発生する、ということです。もし、そのプログラムによって利用者に何らかの被害が生じたら、その責任は作ったあなたに降りかかってきます。

もちろん、最初から「あらゆるセキュリティ対策を施せ」とはいいません。が、少なくとも最低限の「基本的な安全対策」については、プログラムを作るようになったら真っ先に覚えておくべきです。

さて、今作ったサンプルプログラムですが、これにはでっかい「穴」が空いています。では、その穴を確認してみましょう。ブラウザから先ほどのページにアクセスし、以下のように書いて送信してみましょう。
<script>alert("これが穴だ!");</script>
送信すると、画面にアラートウインドウが現れます。入力フィールドに書いたJavaScriptのスクリプトが、ページを読み込む際に実行されたためにこういう現象が起こっているのです。なぜこれが「穴」なのか? それは、「どこの誰かわからない人間が、ここにJavaScriptのスクリプトを書いて、ページを表示した際にそれを実行させてしまうことができる」からです。

例えば、このようなやり方で掲示板のプログラムを作ったとしましょう。すると、そこにアクセスした人間が、今のようにしてJavaScriptのスクリプトをこっそり投稿します。次にこの掲示板にアクセスした人は、みんな表示する際にそのスクリプトが実行されることになります。例えばそのスクリプトで、「ブラウザに保存されているクッキー情報を取り出して他のサイトに送信する」というような処理が書かれていたとしたら? アクセスした人のクッキー情報が、すべて見知らぬ人間に盗まれることになります。

いわゆる「なりすまし」と呼ばれる犯罪は、こうして起こります。このスクリプトを利用した手法は「クロスサイト・スクリプティング(通称、XSS)」と呼ばれ、サイト攻撃の基本中の基本として広く知られています。

では、この空いた「穴」をふさぎましょう。最初にすべきセキュリティ対策は、実は意外と簡単です。テキストを書き出しているecho文のスクリプトを、以下のように書き換えるだけです。
<?php
    echo  htmlspecialchars($result);
?>
この「htmlspecialchars」という関数は、その後の()に書かれた値(引数といいます)をチェックし、HTMLのタグをすべてエスケープ文字に変換したものを返します。つまり、このようにして値を書き出すことで、<script>タグなどをすべて無効化し、働かなくすることができるのです。

フォームを利用する場合には、セキュリティ対策に関する鉄則があります。それは、「ユーザーから送られてきたデータは、絶対にそのまま画面に出力しない」ということです。そこには、どんな内容が記述されているのかわからない、だから必ず「表示しても大丈夫」な形に処理をしてから出力する、それがフォーム利用の基本なのです。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

<?php
	$str =$_POST['text1'];
	if ($str != null){
		$result = "あなたは、「{$str}」と書きました。";
	} else {
		$result = "なにか書いてください。";
	}
?>
<!DOCTYPE html
	PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"
		xml:lang="ja" lang="ja"> 
	<head> 
		<meta http-equiv="Content-Type"
			content="text/html; charset=UTF-8" /> 
		<title>sample page</title>
	</head>
	<body>
		<h1>Hello PHP!</h1>
		<div><?php
			echo  htmlspecialchars($result);
		?></div>
		<form method="post" action="./index.php">
			<input type="text" name="text1">
			<input type="submit">
		</form>
	</body>
</html>

※関連コンテンツ

「初心者のためのPHPプログラミング入門」に戻る