Codeworks Notes

 2021-04-05

 2024-04-19

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 つ作っておけば、後々の繰り返しの作業を省略できます。

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

( 2023.03.07追補、2024.04.19改訂 )

$_POST の Value 値は配列の中に配列が入れ子になることがあります。その場合は foreach を入れ子にすれば解決です。

function sanitize($before) {
	$after = array();	// メイン配列の初期化
	foreach ($before as $key1 => $value1) {
		if (is_array($value1)) {
			$value1after = array();	// サブ配列を初期化
			foreach ($value1 as $key2 => $value2) {
				$value1after[$key2] = htmlspecialchars($value2, ENT_QUOTES, 'UTF-8');
			}
			$after[$key1] = $value1after;
		} else {
			$after[$key1] = htmlspecialchars($value1, ENT_QUOTES, 'UTF-8');
		}
	}
	return $after;
}