PHPプログラミング

ワークショップ

フォームを作る

入力値のサニタイズ

フォームを作成するシリーズ記事の第5段。Webサイトにとって必要不可欠なフォームについて、基本的な仕組みから実践的な機能の実装方法まで、「お問い合わせフォーム」の作成を題材にして解説していきます。

この記事のポイント

  • 入力値をサニタイズ処理する理由が分かる
  • サニタイズ処理を実装する

目次

概要

前回は、フォームの各ページでPOSTパラメータを引き継ぐ設定をしました。
今回は、セキュリティ対策の1つである「入力値のサニタイズ」を実装していきます。

サニタイズとは?

サニタイズとは、フォームにHTMLやプログラミングコード、無効な記号などが入力されたとしても、それらを無効にしてフォームプログラムの予期せぬ動作を未然に防ぐ処置です。

「サニタイズ」は「消毒する」という意味で、プログラミングにおいては入力値などのテキストデータを無害化する意味で使われます。

サニタイズが無効なときの危険性

仮に、フォームの「氏名」に次のようなJavaScriptコードを入力したとします。

フォームにJavaScriptコードを入力

この状態で「入力内容を確認するボタン」を押すと…

外部の別サイトへ遷移するイメージ

フォームに入力したJavaScriptコードが実行され、外部の別サイトへリダイレクトされてしまいました。

このようにコードが入力されてしまうと、意図せぬ動作を引き起こす可能性があり非常に危険です。そのため、フォームの入力値に対しては必ずサニタイズを行い、無害化されたテキストデータにしておきます。

今回使用しているコードは、前回までに作成したものを使うことを前提としています。
前回のページ:vol.4 入力値の引き継ぎ
前回作成したコードはこちら:vol.4のサンプルコード – GitHub

サニタイズに使用する関数

これからフォームにサニタイズを実装していきますが、まずは使用する関数についてみておきましょう。サニタイズはhtmlspecialchars関数を使って行います。

htmlspecialchars関数のパラメータ

ちょっと長い関数名ですね。この関数を使うと、HTMLタグやスクリプトコードを「HTMLエンティティ」へ変換し、無効化することができます。HTMLエンティティとは、文字の素の姿のようなもの。

例えば、HTMLタグ記述で使う「<」であれば、HTMLエンティティは「&lt;」です。同じように、他の文字にも対応するHTMLエンティティが存在します。

HTMLファイルに「<br>」と書くと普通に改行が入ってしまいますが、HTMLエンティティで「&lt;br&gt;」と書けば、HTMLタグとして認識されずに通常テキストとして出力することができます。改行もされません。

パラメータは最大4つ指定できますが、今回は2つ目までを使用します。

今回は、1つ目がサニタイズしたい文字列です。今回であればフォームの入力値が入ります。

2つ目のパラメータは変換ルールを指定する定数が入ります。指定できる値は数種類ありますが、今回は「ENT_QUOTES」を指定します。「ENT_QUOTES」はシングルクォート、ダブルクォートのどちらもHTMLエンティティへ変換する対象とします。

その他、指定できるパラメータの詳細についてはphp.netを参照してください。
htmlspecialchars関数 – php.net

フォームにサニタイズを実装する

それでは、実際にフォームへサニタイズを実装していきましょう。

index.phpに次のコードを入力してください。

Note

赤い箇所は追加するコードを、オレンジの箇所は修正しているコードを示します。

index.php

<?php
//var_dump($_POST);

// 変数の初期化
$page_flag = 0;
$clean = array();

// サニタイズ
if( !empty($_POST) ) {
	foreach( $_POST as $key => $value ) {
		$clean[$key] = htmlspecialchars( $value, ENT_QUOTES);
	}
}

if( !empty($_POST['btn_confirm']) ) {

	$page_flag = 1;

--- 今までのコードが続きます ---

解説

短いコードですが、サニタイズ処理は以上です。
処理の内容を見ていきます。

新しく追加したif文では、POSTパラメータが存在するかを判定しています。もしPOSTパラメータが渡されなければ、このサニタイズ処理は必要ないのでスルー。

その中のforeach文ではPOSTパラメータを配列ごと渡し、入力値を1つずつ取り出してサニタイズしていきます。その後、値を配列$cleanに格納します。

以上の結果から、サニタイズされた入力値は全て$cleanに入っているので、今後の処理でもこの配列にある値を使用するように変更していきます。

今までは全てスーパーグローバルの「$_POST」に入っている値を使ってきましたが、これらを全て$cleanに置き換えていきます。配列のキーは同じなので、単純に「$_POST」から「$clean」へ置換すればOKです。

以上でサニタイズの実装完了です。
次回は、入力された値をチェックするバリデーションを実装します。

今回作成したコードはこちら:vol.5のサンプルコード – GitHub

こちらの記事は役に立ちましたか?

ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。

ありがとうございます。
コメントを送信しました。