Codeworks Notes

 2021-04-05

 2025-05-29

PHP
バックエンド
プログラミング

フォームの値を一括浄化する

SQL インジェクション対策でよく使う htmlspecialchars() を頻繁に使わなくてもいいように、フォームから何か送られてきたらその時点でいっぺんに浄化する方が効率がいい。

関数部分

function sanitize($before) {
	foreach ($before as $key=>$value) {
		$after[$key] = htmlspecialchars($value,ENT_QUOTES,'UTF-8');
	}
	return $after;
}

使うとき

// <input name="hoge">が飛んできたときの例
$post = sanitize($_POST);
$hoge = $post['hoge'];

// 関数を使わない場合の例
$hoge = htmlspecialchars($_POST['hoge'],ENT_QUOTES,'UTF-8');

$hoge = htmlspecialchars($_POST['hoge'] …と長々と書かなくてよくなります。

解説

「 $_POST 」はフォームから送信された値がすべて入ったスーパーグローバル変数です。中身は配列なので foreach で全部浄化したものを戻り値に格納する関数を 1 つ作っておけば、後々の繰り返しの作業を省略できます。

多次元配列だったときの対応

( 2025.05.29追補 )

$_POST の中身は入れ子の配列だったりすることがあるので、上記関数では多次元配列に対応できません。配列の中身も再起的にサニタイズする場合は以下のようにします。

function sanitize($data) {
	return is_array($data)
		? array_map('sanitize', $data)
		: htmlspecialchars($data, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}

array_map()は配列のすべての要素に一定の処理を行って新しい配列を返す関数です。
配列の入れ子の階層の深さが何階層でも大丈夫です。