ワークショップ
お問い合わせフォームを作る(5)
入力値のサニタイズ
フォームを作成するシリーズ記事の第5段。Webサイトにとって必要不可欠なフォームについて、基本的な仕組みから実践的な機能の実装方法まで、「お問い合わせフォーム」の作成を題材にして解説していきます。
この記事のポイント
- 入力値をサニタイズ処理する理由が分かる
- サニタイズ処理を実装する
目次
概要
前回は、フォームの各ページでPOSTパラメータを引き継ぐ設定をしました。
今回は、セキュリティ対策の1つである「入力値のサニタイズ」を実装していきます。
サニタイズとは?
サニタイズとは、フォームにHTMLやプログラミングコード、無効な記号などが入力されたとしても、それらを無効にしてフォームプログラムの予期せぬ動作を未然に防ぐ処置です。
「サニタイズ」は「消毒する」という意味で、プログラミングにおいては入力値などのテキストデータを無害化する意味で使われます。
サニタイズが無効なときの危険性
仮に、フォームの「氏名」に次のようなJavaScriptコードを入力したとします。
この状態で「入力内容を確認するボタン」を押すと…
フォームに入力したJavaScriptコードが実行され、外部の別サイトへリダイレクトされてしまいました。
このようにコードが入力されてしまうと、意図せぬ動作を引き起こす可能性があり非常に危険です。そのため、フォームの入力値に対しては必ずサニタイズを行い、無害化されたテキストデータにしておきます。
今回使用しているコードは、前回までに作成したものを使うことを前提としています。
前回のページ:vol.4 入力値の引き継ぎ
前回作成したコードはこちら:vol.4のサンプルコード – GitHub
サニタイズに使用する関数
これからフォームにサニタイズを実装していきますが、まずは使用する関数についてみておきましょう。サニタイズはhtmlspecialchars関数を使って行います。
ちょっと長い関数名ですね。この関数を使うと、HTMLタグやスクリプトコードを「HTMLエンティティ」へ変換し、無効化することができます。HTMLエンティティとは、文字の素の姿のようなもの。
例えば、HTMLタグ記述で使う「<」であれば、HTMLエンティティは「<」です。同じように、他の文字にも対応するHTMLエンティティが存在します。
HTMLファイルに「<br>」と書くと普通に改行が入ってしまいますが、HTMLエンティティで「<br>」と書けば、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
こちらの記事は役に立ちましたか?
コメントありがとうございます!
運営の参考にさせていただきます。
記事一覧
- お問い合わせフォームを作る (イントロダクション) お問い合わせフォームを作る
- お問い合わせフォームを作る(1) お問い合わせフォームの入力ページを作成する
- お問い合わせフォームを作る(2) フォームの確認ページ&完了ページを作成
- お問い合わせフォームを作る(3) 自動返信メールの実装
- お問い合わせフォームを作る(4) 入力値の引き継ぎ
- お問い合わせフォームを作る(5) 入力値のサニタイズ
- お問い合わせフォームを作る(6) 入力値のバリデーション
- お問い合わせフォームを作る(7) 入力項目に合わせた様々なバリデーション
- お問い合わせフォームを作る(8) フォームにファイルアップロード機能をつける
- お問い合わせフォームを作る(9) アップロードしたファイルをメールに添付する
- お問い合わせフォームを作る(10) セッションでフォームの多重送信を防ぐ
ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。