広告

WordPressの問い合わせフォーム開発でサニタイズ処理の方法

この記事は約3分で読めます。

WordPressのテーマを開発していて、phpcsさんに「$_POST を使うなら、サニタイズしなさい!」と、しこたま叱られたので、叱られない方法を書いておきます。

phpcsさんの設定

WordPressの規約から、コメントの長さを除外したルールを使っています。

順番が大事

1.WordPressのノンスチェック関数とノンスチェックをする

2.$_POSTや$_GETの中身をサニタイズ処理をして無害化する

3.$_POSTや$_GETを使わないで、無害化したものだけで処理する

if ( isset( $_POST['nonce-form'] ) && wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['nonce-form'] ) ), 'nonce-key' ) ) {
	// echo 'ノンスok'; .
	if ( ! empty( $_POST ) ) {
		// NULLバイト除去.
		$get_sanitize = sanitize_null( $_POST );
		// ポストの削除.
		$_POST = array();
		// 文字処理.
		$clean = array();
		foreach ( $get_sanitize as $key => $value ) {
			$clean[ $key ] = htmlspecialchars( $value, ENT_QUOTES, 'UTF-8' );
		}
		// ボタンsubmitを押したとき!
		if ( ! empty( $clean['submit'] ) ) {
			// バリデーション.
			$error_vail = '';
			if ( empty( $clean['name'] ) ) {
				$error_name = 'error';
				$error_vail = 1;
			}

			if ( 1 !== $error_vail ) {
				// echo 'バリデーションok'; .
				// メール送信処理.
				// データクリア.
				$clean = array();
				// 再送信を再読み込みで防ぐ.
				header( 'Location:' . get_permalink() );
				exit;
			}
		}
		// データクリア.
		$clean = array();
	}
}

注意! sanitize_null は自分で作った関数なので、このままだとエラーになります。

sanitize_null は下記をfunction.phpに入れます。

/**
 * NULLバイト除去.
 *
 * @param array $arr 引数.
 */
function sanitize_null( $arr ) {
	if ( is_array( $arr ) ) {
		return array_map( 'sanitize_null', $arr );
	}
	return str_replace( "\0", '', $arr );
}

ちなみに、if文がヨーダ形式にしないとphpcsさんから叱られます。

とりあえず、今のところ警告が出なくなったのでOKにしましたが、セキュリティを考えたら、sessionも使うべきだと思います。ただし、sessionを使おうとして、使えなかったケースもあるので、場合によりけりです。

また、phpcsさんの設定によっても変わるので、これが正しいとは言い切れませんのでご注意ください。