Contents
1️⃣ PHP バージョン管理と公式サポート
重要ポイント
| 項目 | 推奨設定 | 補足 |
|---|---|---|
| 使用 PHP バージョン | PHP 8.2 以上(可能なら 8.3) | 最新のパフォーマンス改善とセキュリティ修正が含まれます。 |
| 自動更新 | cPanel/WHM の MultiPHP Manager で自動適用を有効化 | 手動ミス防止に必須です。 |
| 旧バージョン使用時の対策 | Imunify360 の「PHP Security」機能で脆弱性検知・通知 | パッチ自動適用は行わない点に注意(※)。 |
※Imunify360 は古い PHP バイナリそのものを更新しませんが、脆弱性の検出・アラートや Web アプリケーションファイアウォール (WAF) による保護を提供します。公式情報はImunify360 ドキュメントをご参照ください。
公式サポートスケジュール(PHP.net)
| PHP バージョン | アクティブサポート終了 | セキュリティサポート終了 |
|---|---|---|
| 8.2 | 2024‑12‑08 | 2027‑12‑08 |
| 8.1 | 2023‑11‑25 | 2026‑11‑25 |
| 8.0 | 2022‑11‑26 (終了) | 2025‑11‑26 |
| 7.4 | 2021‑11‑28 (終了) | 2022‑11‑28 (終了) |
※最新情報は公式リリースノート(https://www.php.net/supported-versions.php)で随時確認してください。
実装手順例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 1. cPanel/WHM → MultiPHP Manager で対象ドメインを PHP8.2 に設定 # 2. .user.ini でバージョンチェックスクリプトを自動実行 cat <<'EOF' > /home/user/.user.ini auto_prepend_file = "/home/user/scripts/php-version-check.php" EOF # php-version-check.php(簡易版) <?php if (version_compare(PHP_VERSION, '8.2', '<')) { $msg = sprintf("[警告] 現在の PHP バージョン %s は推奨バージョン未満です。", PHP_VERSION); error_log($msg); mail('admin@example.com', 'PHP バージョン低下検知', $msg); } ?> |
ポイント:
auto_prepend_fileはリクエスト毎に実行されるため、バージョンダウングレードを即座に検出できます。
2️⃣ 危険関数の無効化と安全ラッパー
なぜ無効化が必要か
exec, system, shell_exec, eval などは リモートコード実行 (RCE) の入口になることが多数報告されています。Kinsta が公開した「PHP セキュリティベストプラクティス」でも、これら関数の無効化が推奨されています。
php.ini / .user.ini での設定例
|
1 2 3 4 |
; ==== php.ini または .user.ini に追記 ==== disable_functions = exec,system,shell_exec,passthru,proc_open,popen,curl_exec,\ curl_multi_exec,parse_ini_file,show_source |
Web サーバーが php_value ディレクティブを許可していない場合は、.htaccess ではなく .user.ini を使用してください(Apache の場合は AllowOverride Options が必要)。
必要時の安全ラッパー(最小限に留める)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/** * ホワイトリスト方式の安全コマンド実行ラッパー * * @param string $cmd 実行したいコマンド列(例: "git status") * @return string|false 実行結果、失敗時は false */ function safe_exec( string $cmd ) { // ① 許可コマンドだけをホワイトリストに登録 $whitelist = ['git', 'composer']; $parts = explode(' ', trim($cmd)); $command = array_shift($parts); if ( !in_array($command, $whitelist, true) ) { return false; // 許可外は即座に拒否 } // ② 引数は escapeshellarg で安全化 $escapedArgs = array_map('escapeshellarg', $parts); $fullCmd = $command . ' ' . implode(' ', $escapedArgs); return shell_exec($fullCmd); // ここでも直接 exec 系は使用しない } |
ベストプラクティス:ラッパー関数自体もコードレビューの対象とし、「危険関数が呼び出されていないか」を
grep -E 'exec|system|eval|shell_exec' -r .で定期的にチェックしてください。
3️⃣ 入力データのサニタイズ・エスケープ徹底
WordPress 標準関数の活用
| 処理対象 | 推奨関数 | 例 |
|---|---|---|
| HTML 出力 | wp_kses()、esc_html()、esc_attr() |
echo esc_html( $title ); |
| データベースクエリ | $wpdb->prepare() |
$sql = $wpdb->prepare('SELECT * FROM wp_posts WHERE ID=%d', $id); |
| GET/POST 取得 | filter_input() 系 |
$page = filter_input(INPUT_GET, 'paged', FILTER_VALIDATE_INT, ['options'=>['default'=>1,'min_range'=>1]]); |
カスタム許可タグ(例:埋め込み iframe)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// functions.php に追加 function my_allowed_html( $allowed_tags ) { $custom = [ 'iframe' => [ 'src' => true, 'width' => true, 'height' => true, 'frameborder' => true, 'allowfullscreen' => true, ], ]; return array_merge( $allowed_tags, $custom ); } add_filter( 'wp_kses_allowed_html', 'my_allowed_html' ); |
注意点:
wp_kses()の第二引数は'post'かカスタム配列を渡すようにし、デフォルトの許可タグだけで済むケースでは上書きしないこと。
コードレビュー項目(チェックリスト化)
- [ ]
$_GET/$_POST/$_REQUEST→ いずれもサニタイズ関数が適用されているか - [ ] DB クエリは必ず
$wpdb->prepareが使用されているか - [ ] HTML 出力前に
wp_kses、esc_html*系でエスケープしているか
4️⃣ ファイル・ディレクトリ権限 & バックアップフロー
権限ベストプラクティス(Linux/Unix)
|
1 2 3 4 5 6 7 8 9 10 |
# 1. 所有者を Web サーバーユーザーに変更(例: www-data) chown -R www-data:www-data /var/www/html # 2. ディレクトリは 755、ファイルは 644 に統一 find /var/www/html/ -type d -exec chmod 755 {} \; find /var/www/html/ -type f -exec chmod 644 {} \; # 3. wp-config.php は機密性が高いため 640 に限定 chmod 640 /var/www/html/wp-config.php |
補足:
wp-content/uploadsは書き込みが必要なので、サブディレクトリは755のままで問題ありません。Imunify360 の File Integrity Monitoring(FIM)で権限変更をリアルタイムに検知できます(公式ドキュメント)。
毎日自動バックアップスクリプト例(bash + WP‑CLI)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/bin/bash # /usr/local/bin/wp-backup.sh BACKUP_ROOT="/backup" DATE=$(date +%Y%m%d_%H%M) DEST="${BACKUP_ROOT}/${DATE}" mkdir -p "$DEST" # ① ファイル全体を圧縮 tar -czf "${DEST}/files.tar.gz" /var/www/html # ② データベースダンプ(WP‑CLI 必須) /usr/local/bin/wp db export "${DEST}/db.sql" --add-drop-table --allow-root # ログ出力 echo "$(date '+%Y-%m-%d %H:%M:%S') : Backup completed → $DEST" >> /var/log/wp-backup.log |
cron 設定(毎日 02:00 実行)
|
1 2 |
0 2 * * * /usr/local/bin/wp-backup.sh >/dev/null 2>&1 |
復旧手順概要
- ファイル復元
tar -xzf /backup/20260423_0200/files.tar.gz -C /var/www/html - データベースインポート
/usr/local/bin/wp db import /backup/20260423_0200/db.sql --allow-root
復旧テストはステージング環境で月1回実施し、バックアップの整合性を確認してください。
5️⃣ Imunify360 を活用した総合防御策
5‑1. WAF(Web Application Firewall)設定例
| 攻撃種別 | 推奨ルール | 設定手順 |
|---|---|---|
| SQLi | /wp-admin/admin-ajax.php の不正クエリ文字列をブロック |
Imunify360 → WAF → カスタムルール で REQUEST_URI ~* "admin-ajax\.php" と ARGS に SQL キーワードが含まれる場合 BLOCK |
| XSS | POST データに <script> が含まれたら 403 |
同上、BODY パラメータ正規表現で検出 |
| 管理画面保護 | IP 制限(社内 VPN のみ) | REQUEST_URI ~* "wp-login\.php|/wp-admin" と REMOTE_ADDR !~ "^203\.0\.113\." → BLOCK |
設定例(Imunify360 UI で入力する JSON スニペット)
|
1 2 3 4 5 6 7 8 9 10 11 |
{ "id": 101, "description": "Admin panel IP restriction", "conditions": [ { "type": "uri", "operator": "matches", "value": "(wp-login\\.php|/wp-admin)" }, { "type": "ip", "operator": "not_in", "value": "203.0.113.0/24" } ], "action": "block", "priority": 10 } |
詳細は公式マニュアル「[WAF Custom Rules]」https://docs.imunify360.com/waf/custom-rules.htmlをご参照ください。
5‑2. 脆弱性診断・マルウェアスキャンの運用フロー(AeyeScan 参考)
- Imunify360 の「Malware Scanner」でフルスキャンを実行(週1回推奨)。
- スキャン結果は CSV エクスポートし、Critical な項目は 24 時間以内に修正。
composer auditとwp security scan(WP‑CLI)で依存パッケージとプラグインの脆弱性を確認。- 修正済みかどうかは Jira や GitHub Issues でチケット化し、期限付きで対応。
コマンド例
|
1 2 3 4 5 6 7 |
# Composer の脆弱性チェック composer audit --format=json > /tmp/composer-audit.json # WP-CLI セキュリティスキャン wp core verify-checksums wp plugin status --field=update | grep -v '0' # アップデートが必要なプラグイン一覧 |
5‑3. ログイン保護のベストコンビネーション
| 手段 | 推奨プラグイン / 機能 |
|---|---|
| 強力パスワード | Wordfence → 「Password Policy」 |
| 二要素認証 (2FA) | WP 2FA(無料版で OTP) |
| ログイン URL 隠蔽 | WPS Hide Login |
| ブルートフォース防止 | Imunify360 の Brute Force Protection |
6️⃣ 実践チェックリスト(まとめ)
| カテゴリ | 確認項目 | ステータス |
|---|---|---|
| PHP バージョン | PHP 8.2+ がインストールされ、auto_prepend_file でバージョン検知が有効か |
☐ |
| サーバー自動更新(cPanel/WHM の MultiPHP Manager)がオンになっているか | ☐ | |
| Imunify360 の PHP Security が有効で、脆弱性アラートを受信できているか | ☐ | |
| 危険関数 | disable_functions に対象関数が列挙されているか |
☐ |
| 必要時の安全ラッパーがコードベースに存在し、レビュー済みか | ☐ | |
| サニタイズ | 全ての外部入力($_GET/POST/REQUEST)に filter_input/sanitize_* 系が適用されているか |
☐ |
DB クエリは $wpdb->prepare で安全化されているか |
☐ | |
HTML 出力は wp_kses、esc_html* 系でエスケープしているか |
☐ | |
| 権限 & バックアップ | ディレクトリ 755 / ファイル 644 が徹底されているか(wp-config.php は 640) | ☐ |
| 毎日自動バックアップが稼働し、ログに記録されているか | ☐ | |
| ステージング環境で復旧手順のリハーサルを実施済みか | ☐ | |
| WAF & 脆弱性診断 | Imunify360 のカスタム WAF ルールが適用されているか(SQLi/XSS/管理画面制限) | ☐ |
| 月1回以上、Imunify360 と AeyeScan 手順でスキャンし結果をレビューしているか | ☐ | |
| Critical 脆弱性は 24 時間以内にパッチ適用または削除が完了しているか | ☐ | |
| ログイン保護 | 強力パスワードと 2FA が全ユーザーで必須化されているか | ☐ |
| ログイン URL を変更し、ブルートフォース対策が有効か | ☐ |
使い方:定期的(例: 毎月第1営業日)にこのチェックリストを実行し、ステータス
☑に更新してください。未完了項目は即時対応タスクとしてチケット化すると管理が楽になります。
参考リンク集
| 項目 | URL |
|---|---|
| PHP サポート期間(公式) | https://www.php.net/supported-versions.php |
| WordPress コーディングスタンダード | https://developer.wordpress.org/coding-standards/ |
| Imunify360 ドキュメント(PHP Security) | https://docs.imunify360.com/faq/php-security.html |
| Imunify360 WAF カスタムルール解説 | https://docs.imunify360.com/waf/custom-rules.html |
| Kinsta の PHP セキュリティベストプラクティス | https://kinsta.com/blog/php-security/ |
| GIG(日本) WordPress セキュリティ記事 | https://gig.jp/wordpress-security/ |
| AeyeScan 脆弱性診断レポート例 | https://aeyescans.com/sample-report |
| WP‑CLI 公式サイト | https://wp-cli.org/ |
最後に
- PHP 8.2+ の導入はパフォーマンス向上だけでなく、長期的なセキュリティ確保の第一歩です。
- Imunify360 は「脆弱性検知・WAF」として位置付け、古い PHP を直接更新する代替策ではありません。
- コードレビューと自動化(スクリプト・cron)を組み合わせることで、人為的ミスや設定忘れを防げます。
このガイドに沿って環境を点検し、安全かつ高速な WordPress サイト運営を実現してください。 🚀