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さんの設定によっても変わるので、これが正しいとは言い切れませんのでご注意ください。