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


