エスケープ・サニタイズ・セキュリティとは|このカテゴリで分かること
WordPressでテーマやプラグインを書くとき、避けて通れないのが「入力をきれいにする(サニタイズ)」「出力を安全にする(エスケープ)」「リクエストの正当性を確かめる(nonce)」の3つです。このカテゴリでは、esc_ 系、sanitize_ 系、wp_kses 系、nonce 系の関数を集め、WordPress エスケープの使い分けを一通り理解できるようにします。XSSやCSRFといった脆弱性を避けたい制作者向けの全体マップです。
読む順番(おすすめの順路)
- esc_html() の使い方|説明・引数・注意点 … まず最も基本の、HTML内テキストのエスケープから。
- esc_attr() の使い方|説明・引数・注意点 … 属性値は別の関数を使う、という感覚をつかみます。
- esc_url() の使い方|説明・引数・注意点 … href や src に入れるURL用です。
- esc_url_raw() の使い方|説明・引数・注意点 … 出力ではなく保存や転送に使うURL向けの違いを確認します。
- esc_html__() の使い方|説明・引数・注意点 … 翻訳文字列とエスケープを一度に行う書き方。
- esc_textarea() の使い方|説明・引数・注意点 … textarea 内の出力用です。
- esc_js() の使い方|説明・引数・注意点 … インラインJavaScript用。使う場面は限られます。
- sanitize_text_field() の使い方|説明・引数・注意点 … 入力側の定番。フォーム値の受け取りで必須になります。
- sanitize_textarea_field() の使い方|説明・引数・注意点 … 改行を残したい入力向け。
- sanitize_email() の使い方|説明・引数・注意点 と sanitize_key() の使い方|説明・引数・注意点 … 型ごとの専用関数を知っておくと便利です。
- wp_kses() の使い方|説明・引数・注意点 … 許可するHTMLタグを自分で決める場合に。
- wp_kses_post() の使い方|説明・引数・注意点 … 投稿本文と同じ許可リストで済ませる近道です。
- wp_unslash() の使い方|説明・引数・注意点 … $_POST などを扱う前に必要になる処理。
- wp_create_nonce() の使い方|説明・引数・注意点 … nonce の作成から。
- wp_nonce_field() の使い方|説明・引数・注意点 … フォームへ埋め込む方法です。
- wp_verify_nonce() の使い方|説明・引数・注意点 … 受け取り側の検証。
- 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か属性か」を先に判断する習慣をつけるほうが身につくと考えます。迷ったときは出力時にエスケープしておけば大きく外しにくく、サニタイズは受け取るデータの型に合わせて選ぶ、という整理がおすすめです。ただし、本記事群は学習用の整理であり、実際のサイトでは公式ハンドブックとコードレビューで確認することをすすめます。