2026年8月25日

2026年8月25日

WordPressのwp-config.phpを正しく設定してセキュリティを強化する方法

はじめに

wp-config.phpはWordPressの心臓部ともいえる設定ファイルで、データベース認証情報からデバッグ設定、パフォーマンスチューニングまでを一元管理します。デフォルトのままでは脆弱な部分も多いため、セキュリティキーの更新、テーブルプレフィックスの変更、ファイルをWebルート外に移動するなどの対策が必要です。

症状・原因

  • テーブルプレフィックスがデフォルトのwp_のままでSQLインジェクションのリスクが高い
  • セキュリティキーが古く、セッションハイジャックの可能性がある
  • 本番環境でWP_DEBUGがtrueのままでエラーが画面に表示されている
  • wp-config.phpがWebルートに置かれており、サーバー設定不備時に内容が閲覧できる
  • WP_POST_REVISIONSの設定がなく不要なリビジョンでDBが肥大化している

解決手順

ステップ1:データベース認証情報とテーブルプレフィックスのセキュリティ

<?php
/**
 * wp-config.php - データベース設定とテーブルプレフィックス
 *
 * 注意:このファイルには機密情報が含まれます。
 * Gitリポジトリにコミットしないよう .gitignore に追加してください。
 */

// =======================================================
// データベース設定
// =======================================================

/** WordPressのためのデータベース名 */
define( 'DB_NAME', 'your_database_name' );

/** MySQLデータベースのユーザー名 */
define( 'DB_USER', 'your_database_user' );

/** MySQLデータベースのパスワード(強力なパスワードを使用) */
define( 'DB_PASSWORD', 'your_strong_database_password_here' );

/** MySQLのホスト名(通常は localhost) */
define( 'DB_HOST', 'localhost' );

/** データベースのテーブルを作成する際のデータベースの文字セット */
define( 'DB_CHARSET', 'utf8mb4' );

/** データベースの照合順序 */
define( 'DB_COLLATE', '' );

// =======================================================
// テーブルプレフィックスの変更(重要なセキュリティ設定)
// =======================================================
/**
 * デフォルトの "wp_" から変更することを強く推奨
 * 変更後はWordPressを再インストールするか、
 * 既存サイトの場合はすべてのテーブル名を手動でリネームする必要がある
 *
 * 新規インストール時のみ変更可能
 * ランダムな文字列 + アンダースコアを使用する
 */
$table_prefix = 'wpx7k3_'; // デフォルトの wp_ から変更

// =======================================================
// 既存サイトのテーブルプレフィックス変更(上級者向け)
// =======================================================
// 以下のSQLを phpMyAdmin や WP-CLI で実行してから prefix を変更する:
/*
RENAME TABLE `wp_commentmeta` TO `wpx7k3_commentmeta`;
RENAME TABLE `wp_comments` TO `wpx7k3_comments`;
RENAME TABLE `wp_links` TO `wpx7k3_links`;
RENAME TABLE `wp_options` TO `wpx7k3_options`;
RENAME TABLE `wp_postmeta` TO `wpx7k3_postmeta`;
RENAME TABLE `wp_posts` TO `wpx7k3_posts`;
RENAME TABLE `wp_term_relationships` TO `wpx7k3_term_relationships`;
RENAME TABLE `wp_term_taxonomy` TO `wpx7k3_term_taxonomy`;
RENAME TABLE `wp_termmeta` TO `wpx7k3_termmeta`;
RENAME TABLE `wp_terms` TO `wpx7k3_terms`;
RENAME TABLE `wp_usermeta` TO `wpx7k3_usermeta`;
RENAME TABLE `wp_users` TO `wpx7k3_users`;

-- オプションテーブル内のプレフィックス参照も更新
UPDATE `wpx7k3_options` SET option_name = 'wpx7k3_user_roles' WHERE option_name = 'wp_user_roles';
UPDATE `wpx7k3_usermeta` SET meta_key = REPLACE(meta_key, 'wp_', 'wpx7k3_');
*/
?>

ステップ2:セキュリティキーの生成と設定

<?php
/**
 * WordPressセキュリティキーの設定
 *
 * セキュリティキーはCookieの暗号化に使用される
 * https://api.wordpress.org/secret-key/1.1/salt/ から新しいキーを生成して貼り付ける
 *
 * 定期的な更新(3〜6ヶ月に1回)を推奨。
 * 更新するとすべてのログインセッションが無効になるのでメンテナンス時に実施する。
 */

define( 'AUTH_KEY',         'ここに生成したキーを貼り付ける(60文字以上)' );
define( 'SECURE_AUTH_KEY',  'ここに生成したキーを貼り付ける(60文字以上)' );
define( 'LOGGED_IN_KEY',    'ここに生成したキーを貼り付ける(60文字以上)' );
define( 'NONCE_KEY',        'ここに生成したキーを貼り付ける(60文字以上)' );
define( 'AUTH_SALT',        'ここに生成したキーを貼り付ける(60文字以上)' );
define( 'SECURE_AUTH_SALT', 'ここに生成したキーを貼り付ける(60文字以上)' );
define( 'LOGGED_IN_SALT',   'ここに生成したキーを貼り付ける(60文字以上)' );
define( 'NONCE_SALT',       'ここに生成したキーを貼り付ける(60文字以上)' );

/*
 * WP-CLIでセキュリティキーを更新するコマンド:
 * wp config shuffle-salts
 *
 * curlで新しいキーを取得する場合:
 * curl -s https://api.wordpress.org/secret-key/1.1/salt/
 *
 * セキュリティキーが侵害された可能性がある場合(ハッキング等)は
 * 速やかに更新して全セッションを無効化してください。
 */
?>

ステップ3:WP_DEBUG設定とデバッグログの制御

<?php
/**
 * デバッグ設定
 *
 * 本番環境では WP_DEBUG = false が必須
 * ログはファイルに書き込み、画面には表示しない
 */

// =======================================================
// 本番環境(Production)の設定
// =======================================================
define( 'WP_DEBUG',         false ); // エラーをまったく表示しない
define( 'WP_DEBUG_LOG',     false ); // ログファイルに書き込まない
define( 'WP_DEBUG_DISPLAY', false ); // 画面に表示しない(WP_DEBUGがtrueでも)
define( 'SCRIPT_DEBUG',     false ); // 圧縮済みのJS/CSSを使用
define( 'SAVEQUERIES',      false ); // クエリの記録なし(メモリ節約)

// =======================================================
// 開発環境(Development)の設定
// =======================================================
/*
define( 'WP_DEBUG',         true );  // デバッグモード有効
define( 'WP_DEBUG_LOG',     true );  // /wp-content/debug.log に記録
define( 'WP_DEBUG_DISPLAY', false ); // 画面には表示しない(ログファイルのみ)
define( 'SCRIPT_DEBUG',     true );  // 未圧縮のJS/CSSを使用(デバッグしやすい)
define( 'SAVEQUERIES',      true );  // 全SQLクエリを $wpdb->queries に記録

// ログファイルを wp-content 以外のパスに変更する場合
// ini_set( 'error_log', '/var/log/wordpress-debug.log' );
// ini_set( 'log_errors', '1' );
*/

// =======================================================
// ステージング環境(Staging)の設定
// =======================================================
/*
define( 'WP_DEBUG',         true );
define( 'WP_DEBUG_LOG',     true );  // ファイルにログ記録
define( 'WP_DEBUG_DISPLAY', false ); // 画面には非表示
define( 'SCRIPT_DEBUG',     false ); // 圧縮版を使用(本番に近い状態でテスト)
*/

/**
 * 環境変数で環境を判定して自動切り替えする例
 * サーバー設定で WP_ENV 変数を設定しておく
 */
$wp_env = getenv( 'WP_ENV' ) ?: 'production';

if ( 'development' === $wp_env ) {
    define( 'WP_DEBUG',         true );
    define( 'WP_DEBUG_LOG',     true );
    define( 'WP_DEBUG_DISPLAY', false );
    define( 'SCRIPT_DEBUG',     true );
} else {
    define( 'WP_DEBUG',         false );
    define( 'WP_DEBUG_LOG',     false );
    define( 'WP_DEBUG_DISPLAY', false );
}
?>

ステップ4:パフォーマンス定数の設定

<?php
/**
 * パフォーマンス改善のための wp-config.php 定数設定
 */

// =======================================================
// キャッシュ設定
// =======================================================

/**
 * オブジェクトキャッシュの有効化
 * W3 Total CacheやRedisプラグインと連携して動作する
 */
define( 'WP_CACHE', true );

/**
 * メモリ制限(ステップ5の記事と関連)
 * PHPのメモリ制限以下の値を設定すること
 */
define( 'WP_MEMORY_LIMIT',     '256M' ); // フロントエンド
define( 'WP_MAX_MEMORY_LIMIT', '512M' ); // 管理画面・一括処理

// =======================================================
// 自動保存とリビジョン設定
// =======================================================

/**
 * 自動保存の間隔(秒)
 * デフォルト:60秒
 * 大きくするとDB書き込みが減るがデータロストのリスクが上がる
 */
define( 'AUTOSAVE_INTERVAL', 300 ); // 5分間隔に変更

/**
 * 保存するリビジョン数の制限
 * デフォルト:無制限(DBが肥大化する原因)
 * false にすると無効、数値で最大保存数を指定
 */
define( 'WP_POST_REVISIONS', 5 ); // 最大5件のリビジョンのみ保持

/**
 * ゴミ箱の自動削除日数
 * デフォルト:30日
 * 0 にするとゴミ箱機能を無効化
 */
define( 'EMPTY_TRASH_DAYS', 14 ); // 14日で自動削除

// =======================================================
// ファイル編集とアップデート設定
// =======================================================

/**
 * 管理画面からのファイル編集を無効化(セキュリティ強化)
 * ハッカーが管理画面にアクセスしてもPHPを直接編集できなくなる
 */
define( 'DISALLOW_FILE_EDIT', true );

/**
 * 管理画面からのプラグイン/テーマのインストール・更新を無効化
 * FTP経由のみ許可する場合(高セキュリティ環境向け)
 */
// define( 'DISALLOW_FILE_MODS', true ); // 必要な場合のみ有効化

/**
 * 自動コアアップデートの設定
 * true: メジャー含む全自動更新
 * 'minor': マイナー更新のみ自動(推奨)
 * false: 自動更新を無効化
 */
define( 'WP_AUTO_UPDATE_CORE', 'minor' ); // セキュリティアップデートのみ自動

// =======================================================
// URLとパス設定
// =======================================================

/**
 * SSLを強制する(HTTPS環境での管理画面ログイン)
 */
define( 'FORCE_SSL_ADMIN', true );

/**
 * Cronの実行方法
 * WP-Cronをサーバーcronで代替する場合
 */
// define( 'DISABLE_WP_CRON', true ); // サーバーcronを使用する場合
?>

ステップ5:wp-config.phpをWebルート外に移動してセキュリティを強化

<?php
/**
 * wp-config.php をドキュメントルートの一つ上のディレクトリに移動する方法
 *
 * 通常のディレクトリ構造:
 * /var/www/html/          ← ドキュメントルート(Webからアクセス可能)
 *   ├── wp-config.php     ← 危険!Webから直接アクセス可能な場所にある
 *   ├── wp-admin/
 *   ├── wp-content/
 *   └── wp-includes/
 *
 * 移動後の推奨ディレクトリ構造:
 * /var/www/               ← ドキュメントルートの一つ上(Webからアクセス不可)
 *   └── wp-config.php     ← 安全!Webから直接アクセスできない
 * /var/www/html/          ← ドキュメントルート
 *   ├── index.php         ← Webからアクセス可能(問題なし)
 *   ├── wp-admin/
 *   └── ...
 */

// =======================================================
// 手順:wp-config.php の移動
// =======================================================

// 1. wp-config.php を一つ上のディレクトリにコピー
//    cp /var/www/html/wp-config.php /var/www/wp-config.php

// 2. 元の wp-config.php を置き換える新しいファイルを作成
//    新しい /var/www/html/wp-config.php の内容(最低限):
?>

<?php
/** wp-config.php が一つ上のディレクトリにある場合の設定 */

// 上のディレクトリの wp-config.php を読み込む
$wp_config_path = dirname( __DIR__ ) . '/wp-config.php';

if ( file_exists( $wp_config_path ) ) {
    require_once $wp_config_path;
} else {
    // フォールバック:さらに上のディレクトリも検索
    $possible_paths = array(
        dirname( __DIR__ ) . '/wp-config.php',
        dirname( dirname( __DIR__ ) ) . '/wp-config.php',
    );

    foreach ( $possible_paths as $path ) {
        if ( file_exists( $path ) ) {
            require_once $path;
            break;
        }
    }
}

/**
 * 注意点:
 * - WordPressが自動的に一つ上のディレクトリも検索するため、
 *   多くの場合は移動するだけで動作する
 * - ただし、一部のホスティング環境では機能しない場合がある
 * - 移動後はパーミッション(600または640)を設定すること
 *
 * ファイルパーミッション設定:
 * chmod 600 /var/www/wp-config.php    # オーナーのみ読み書き可能
 * chmod 644 /var/www/html/index.php   # 一般的なPHPファイルのパーミッション
 *
 * .htaccess で wp-config.php へのアクセスをブロック(二重対策):
 * <files wp-config.php>
 *     Order allow,deny
 *     Deny from all
 * </files>
 */
?>

注意事項

  • バージョン管理除外: wp-config.phpには認証情報が含まれるため、.gitignoreに必ず追加してください。代わりにwp-config-sample.phpをバージョン管理してください
  • テーブルプレフィックス変更: 既存サイトでプレフィックスを変更する場合、すべてのテーブルとoptions/usermetaテーブル内の参照も更新する必要があります。WP-CLIのwp search-replaceが便利です
  • セキュリティキー更新後: すべてのログインセッションが無効になるため、管理者を含む全ユーザーが再ログインを求められます。計画的に実施してください
  • DISALLOW_FILE_EDIT: ファイルエディタを無効にするとセキュリティは向上しますが、テーマやプラグインの管理画面からの編集もできなくなります

まとめ

wp-config.phpのセキュリティ強化には、テーブルプレフィックスの変更、セキュリティキーの定期更新、本番環境でのデバッグ無効化、WP_POST_REVISIONSなどのパフォーマンス定数設定、そしてファイル自体のWebルート外への移動が効果的です。関連記事:WordPressのメモリ制限エラーを解決する方法

お気軽にご相談ください

お見積りへ お問い合わせへ