WordPress エスケープとサニタイズの違い

エスケープ・サニタイズ・セキュリティとは|このカテゴリで分かること

WordPressでテーマやプラグインを書くとき、避けて通れないのが「入力をきれいにする(サニタイズ)」「出力を安全にする(エスケープ)」「リクエストの正当性を確かめる(nonce)」の3つです。このカテゴリでは、esc_ 系、sanitize_ 系、wp_kses 系、nonce 系の関数を集め、WordPress エスケープの使い分けを一通り理解できるようにします。XSSやCSRFといった脆弱性を避けたい制作者向けの全体マップです。

読む順番(おすすめの順路)

  1. esc_html() の使い方|説明・引数・注意点 … まず最も基本の、HTML内テキストのエスケープから。
  2. esc_attr() の使い方|説明・引数・注意点 … 属性値は別の関数を使う、という感覚をつかみます。
  3. esc_url() の使い方|説明・引数・注意点 … href や src に入れるURL用です。
  4. esc_url_raw() の使い方|説明・引数・注意点 … 出力ではなく保存や転送に使うURL向けの違いを確認します。
  5. esc_html__() の使い方|説明・引数・注意点 … 翻訳文字列とエスケープを一度に行う書き方。
  6. esc_textarea() の使い方|説明・引数・注意点 … textarea 内の出力用です。
  7. esc_js() の使い方|説明・引数・注意点 … インラインJavaScript用。使う場面は限られます。
  8. sanitize_text_field() の使い方|説明・引数・注意点 … 入力側の定番。フォーム値の受け取りで必須になります。
  9. sanitize_textarea_field() の使い方|説明・引数・注意点 … 改行を残したい入力向け。
  10. sanitize_email() の使い方|説明・引数・注意点 と sanitize_key() の使い方|説明・引数・注意点 … 型ごとの専用関数を知っておくと便利です。
  11. wp_kses() の使い方|説明・引数・注意点 … 許可するHTMLタグを自分で決める場合に。
  12. wp_kses_post() の使い方|説明・引数・注意点 … 投稿本文と同じ許可リストで済ませる近道です。
  13. wp_unslash() の使い方|説明・引数・注意点 … $_POST などを扱う前に必要になる処理。
  14. wp_create_nonce() の使い方|説明・引数・注意点 … nonce の作成から。
  15. wp_nonce_field() の使い方|説明・引数・注意点 … フォームへ埋め込む方法です。
  16. wp_verify_nonce() の使い方|説明・引数・注意点 … 受け取り側の検証。
  17. check_admin_referer() の使い方|説明・引数・注意点 … 管理画面処理向けの検証と、wp_nonce_url() の使い方|説明・引数・注意点 によるリンクへの付与で締めます。

押さえておきたいポイント(リサーチ)

公式ドキュメントで確認できた内容です。仕様は変わることがあるため、最新は公式で確認してください。

  • エスケープは出力の直前に行う「遅延エスケープ」が推奨されています。コンテキストに合った関数を1回だけ使う、というのが原則です。
  • esc_html() は2.8.0で導入され、HTMLブロック内の文字列を安全な形式に変換します。
  • sanitize_text_field() は2.9.0で導入され、無効なUTF-8の検査、タグの除去、改行・タブ・余分な空白の削除などを行います。SQLインジェクション対策の代わりにはならないため、データベース処理には wpdb::prepare() を使います(関数ページの投稿ノートでも案内されています)。
  • nonce は主にCSRF対策で、既定の有効期間は24時間ですが、実際には12〜24時間の幅があります。認証や認可の代わりにはならず、権限確認には current_user_can() を併用します。
場面 主な関数
HTMLテキストの出力 esc_html() の使い方|説明・引数・注意点
属性値の出力 esc_attr() の使い方|説明・引数・注意点
URLの出力 esc_url() の使い方|説明・引数・注意点
フォーム入力の受け取り sanitize_text_field() の使い方|説明・引数・注意点

よくある疑問

Q. エスケープとサニタイズはどちらか一方でよいですか。
A. 役割が違うため両方考えます。入力時はサニタイズ、出力時はエスケープが基本です。

Q. nonce があれば権限確認は不要ですか。
A. いいえ。nonce は認可の代わりになりません。wp_verify_nonce() の使い方|説明・引数・注意点 と権限確認を組み合わせます。

Q. SQLにはどの関数を使いますか。
A. 値の埋め込みには wpdb::prepare() を使い、esc_sql() の使い方|説明・引数・注意点 は限定的な場面で参照します。

編集部の見解

セキュリティ関連の関数は、名前を暗記するより「入力か出力か、HTMLかURLか属性か」を先に判断する習慣をつけるほうが身につくと考えます。迷ったときは出力時にエスケープしておけば大きく外しにくく、サニタイズは受け取るデータの型に合わせて選ぶ、という整理がおすすめです。ただし、本記事群は学習用の整理であり、実際のサイトでは公式ハンドブックとコードレビューで確認することをすすめます。

出典(一次情報)

エスケープ・サニタイズ・セキュリティ

wp_verify_nonce が false になる原因|nonce の作り方と検証

wp_verify_nonce が false を返す、「リンクの有効期限が切れました」と出る。そんなときの原因を、action名の不一致・ログイン状態・有効期限・キャッシュに分けて、実測結果つきで整理します。
エスケープ・サニタイズ・セキュリティ

esc_html と esc_attr の違い|使い分けと esc_url が必要な場面

esc_html と esc_attr は出力が同じに見えますが、使う場所が違います。HTMLの本文と属性値、URL、JavaScriptでの使い分けを、実際に実行した出力と一緒に整理します。
エスケープ・サニタイズ・セキュリティ

sanitize_title_with_dashes() の使い方|説明・引数・注意点

sanitize_title_with_dashes() は、文字列を、小文字・ハイフン区切りのスラッグに整える関数です。sanitize_title() が内部で使います。
エスケープ・サニタイズ・セキュリティ

esc_html__() の使い方|説明・引数・注意点

esc_html__() は、文字列を翻訳して、HTMLのテキスト用にエスケープして、値として返す関数です。
エスケープ・サニタイズ・セキュリティ

esc_url() の使い方|説明・引数・注意点

esc_url() は、URLを検証・エスケープする関数です。許可されていないプロトコルは取り除かれます。
エスケープ・サニタイズ・セキュリティ

wp_verify_nonce() の使い方|説明・引数・注意点

wp_verify_nonce() は、nonceが正しいかを検証する関数です。
エスケープ・サニタイズ・セキュリティ

wp_unslash() の使い方|説明・引数・注意点

wp_unslash() は、入力値に自動で付与されるバックスラッシュを取り除く関数です。
エスケープ・サニタイズ・セキュリティ

sanitize_user() の使い方|説明・引数・注意点

sanitize_user() は、ユーザー名として使えない文字を取り除く関数です。
エスケープ・サニタイズ・セキュリティ

sanitize_hex_color() の使い方|説明・引数・注意点

sanitize_hex_color() は、16進数のカラーコード(#fff や #ffffff)を検証する関数です。
エスケープ・サニタイズ・セキュリティ

sanitize_key() の使い方|説明・引数・注意点

sanitize_key() は、小文字の英数字・アンダースコア・ハイフンのみを残す関数です。キー名やスラッグ向けです。