ℹ️ このページについて
このページはプラグイン開発者向けの技術的なセキュリティ実装ガイドです。
一般ユーザー向けのWordPressセキュリティ対策は以下をご覧ください:
🔒 セキュリティ対策
プラグインの脆弱性はサイト全体のリスクに直結します。SQLインジェクション・XSS・CSRFの3大脅威への対策と、入力値の正しい処理方法を完全に身につけましょう。
⚠️ プラグインの主な脆弱性
WordPressプラグインで特に注意が必要な脆弱性を理解しましょう。多くのハッキング被害はプラグインの脆弱性を突いたものです。
| 脆弱性 | 概要 | 主な対策 |
|---|---|---|
| SQLインジェクション | 悪意あるSQL文をクエリに注入してDBを不正操作 | $wpdb->prepare() |
| XSS(クロスサイトスクリプティング) | 悪意あるスクリプトをページに埋め込み訪問者を攻撃 | エスケープ関数群 |
| CSRF(クロスサイトリクエストフォージェリ) | ログイン済みユーザーに意図しない操作をさせる | nonce検証 |
| ファイルインクルード | 外部ファイルをPHPに読み込ませてコードを実行 | ABSPATHチェック |
| 権限昇格 | 本来できない操作を一般ユーザーが実行できてしまう | current_user_can() |
🛡️ SQLインジェクション対策
データベースへのクエリは必ず $wpdb->prepare() を使います。絶対に文字列を直接結合しないでください。
🛡️ XSS対策 — コンテキスト別エスケープ関数
出力先の「コンテキスト」によって使う関数が変わります。間違った関数を使うと XSS を防げません。
🎯 覚え方: 「遅延エスケープ」原則
データは「保存する直前にサニタイズ」、「出力する直前にエスケープ」します。早めにエスケープしてしまうと、エスケープ済みのデータがさらにエスケープされる「二重エスケープ」が起きます。
🛡️ 入力値のサニタイズ関数一覧
フォームから受け取ったデータを保存・処理する前に清浄化します。
| 関数 | 用途 | 動作 |
|---|---|---|
sanitize_text_field() | 一行テキスト | HTMLタグ・余分な空白・改行を除去 |
sanitize_textarea_field() | 複数行テキスト | HTMLタグ除去、改行は保持 |
sanitize_email() | メールアドレス | メール形式の文字のみ残す |
sanitize_url() | URL | URLとして無効な文字を除去 |
absint() | 正の整数 | 絶対値に変換(常に0以上) |
sanitize_hex_color() | カラーコード | #RRGGBB 形式のみ許可 |
sanitize_file_name() | ファイル名 | 安全な文字のみ残す |
wp_kses_post() | 投稿内のHTML | WordPress許可リストのタグのみ残す |
wp_kses() | カスタム許可HTML | 許可タグ・属性を自分で定義 |
💡 バリデーション・サニタイズ・エスケープの違い
バリデーション:値が正しい形式か確認する(不正ならエラー返す)
サニタイズ:不正な部分を除去・変換して保存可能な状態にする(保存前)
エスケープ:出力先のコンテキストに合わせて特殊文字を変換する(出力時)
3つすべてを組み合わせるのが最も安全です。
🔒 nonce によるCSRF対策
nonce(Number Used Once)はフォーム送信が正規ユーザーによる操作かを検証するワンタイムトークンです。
⚠️ セキュリティの3点セット(必ず全部実装する)
- nonce の検証 — CSRF攻撃(第三者サイトからの偽リクエスト)を防ぐ
- 権限の確認 — 権限のないユーザーの操作を防ぐ
- 入力値のサニタイズ — 不正なデータの保存を防ぐ
🔐 その他のセキュリティ対策
直接アクセスを防ぐ
すべてのPHPファイルの先頭に記述します。WordPressを経由せず直接ファイルにアクセスされることを防ぎます。
パスワード・APIキーの安全な管理
APIキーなどの機密情報は update_option() でDBに保存します。ファイルに直書きすると、GitやSVNで誤って公開してしまう危険があります。
パスワードのハッシュ化
独自のパスワード機能を作る場合は必ずハッシュ化します。
✏️ 演習:安全なフォーム処理を実装しよう
📝 課題
- 名前・メール・本文を受け取るフォームを管理画面に作成する
- nonce検証・権限チェック・サニタイズを3点セットで実装する
- フィールドに応じたサニタイズ関数を使い分ける
- 出力時に esc_html() と esc_attr() を使い分ける
- (発展)$wpdb->prepare() を使ってカスタムテーブルに安全に保存する
✅ この章のチェックリスト
- $wpdb->prepare()でSQLインジェクションを防げた
- コンテキストに合ったエスケープ関数を7種類使い分けられた
- サニタイズ関数で入力値を清浄化できた
- nonce・権限チェック・サニタイズの3点セットを実装できた
- 全PHPファイルの先頭にABSPATHチェックを追加した
- 「遅延エスケープ」の原則を理解した
🔗 関連ページ・次のステップ
📚 一般ユーザー向けセキュリティ対策
プラグイン開発だけでなく、サイト運用全般のセキュリティ対策も重要です:
- → WordPressセキュリティ完全ガイド(全10ページ) - 基本対策・プラグイン選定・WAF・復旧手順
- → 脆弱性対策 - プラグイン・テーマの選定基準
- → テーマ開発者向けセキュリティ - エスケープ・サニタイズ実装
📘 前提知識
- STEP 3: 管理画面を作る(nonce基礎)
- STEP 4: 機能を実装する(フォーム処理)
🚀 あわせて学ぶ
- データベース操作($wpdb->prepare())
- REST API拡張(パーミッション設定)
- テストとデバッグ(セキュリティのテスト)
📚 補足
- 実例集(安全なフォーム処理の実装例)
- トラブルシューティング