2026年5月23日

2026年5月23日

WordPressのAPIキー・シークレットを.envファイルで安全に管理する方法

WordPressで外部サービスのAPIキーやシークレットを扱うときは、値をWebから見えない場所の .env ファイル(またはサーバーの環境変数)に置き、wp-config.php で定数に読み込んでからプラグインやテーマで参照する形が安全です。この記事では、ファイルの置き場所、読み込み方法、Web公開とGitへの混入を防ぐ設定、漏れたときの対応までを順に説明します。

なぜコードやデータベースに直接書かないのか

APIキーをテーマの functions.php やプラグインのコードに直書きすると、次のような経路で漏れやすくなります。

  • テーマやプラグインをGitで管理していて、そのままリポジトリに含めてしまう
  • テーマを配布・共有したときにキーも一緒に渡ってしまう
  • バックアップファイルやステージング環境のコピーに平文のまま残る

設定画面からキーを入力してデータベース(wp_options)に保存する方式も一般的ですが、データベースのダンプや管理者権限を持つユーザーから値が見えてしまいます。キーをコードとデータから切り離し、サーバー上の1か所で管理しておくと、差し替え(ローテーション)も環境ごとの切り替えも楽になります。

.envファイルはWebルートの外に置く

もっとも大切なのは置き場所です。.env をドキュメントルート(public_html など)の中に置くと、Webサーバーの設定次第で https://example.com/.env から中身を読まれてしまいます。ドキュメントルートの1つ上の階層に置けば、URLから直接たどることはできません。

/home/user/example.com/
├── .env              ← ここに置く(Webから見えない)
├── .env.example      ← ダミー値だけのひな形(Gitに含めてよい)
├── composer.json
├── vendor/
└── public_html/      ← ドキュメントルート
    ├── wp-config.php
    └── wp-content/

.env の中身は「キー名=値」の形で書きます。ここではダミー値を使っています。

MY_SERVICE_API_KEY=your-api-key
MY_SERVICE_SECRET=your-secret

ファイルの権限は、PHPを実行するユーザーだけが読めるように 600(同じグループのプロセスが読む構成なら 640)にします。共用サーバーでは、PHPがどのユーザーで動くかをサーバー会社の案内で確認してから設定してください。

wp-config.phpで読み込んで定数にする

Composerが使える環境では、定番のライブラリ vlucas/phpdotenv で読み込むのが簡単です。作業前に wp-config.php のバックアップを取り、ステージング環境で動作を確認してから本番に反映してください。

cd /home/user/example.com
composer require vlucas/phpdotenv

wp-config.php の「編集はここまで」を示すコメント行(/* That's all, stop editing! ... )より前に、次のように書きます。

// .env を読み込む(ファイルがなくてもエラーにしない safeLoad を使う)
require_once dirname( __DIR__ ) . '/vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable( dirname( __DIR__ ) );
$dotenv->safeLoad();

// プラグインやテーマから参照する定数にする
define( 'MY_SERVICE_API_KEY', $_ENV['MY_SERVICE_API_KEY'] ?? '' );
define( 'MY_SERVICE_SECRET', $_ENV['MY_SERVICE_SECRET'] ?? '' );

createImmutable() で読み込んだ値は $_ENV と $_SERVER に入り、getenv() では取得できません。getenv() で読みたい場合は createUnsafeImmutable() を使う方法もありますが、プロセス全体の環境変数を書き換えるため、上のように $_ENV から定数へ移す形をおすすめします。

Composerを使わない場合は、サーバー側で環境変数を設定し、getenv() で受け取る方法があります。PHP-FPMならプールの設定ファイルに書けます(反映にはPHP-FPMの再起動が必要です)。

; /etc/php/8.3/fpm/pool.d/www.conf(パスは環境によって異なる)
env[MY_SERVICE_API_KEY] = your-api-key
define( 'MY_SERVICE_API_KEY', getenv( 'MY_SERVICE_API_KEY' ) ?: '' );

なお、最初からこの構成になっているWordPressの雛形として Bedrock(Roots)があります。新規サイトであれば検討の価値があります。

プラグインやテーマから使う

キーは定数として参照し、未設定のときは処理を止めてエラーを返すようにします。下は独自のmu-pluginとして wp-content/mu-plugins/ に置く例です。

<?php
/**
 * Plugin Name: My Service Client
 */

function my_service_get( $endpoint ) {
	if ( ! defined( 'MY_SERVICE_API_KEY' ) || '' === MY_SERVICE_API_KEY ) {
		return new WP_Error( 'my_service_no_key', 'APIキーが設定されていません。' );
	}

	return wp_remote_get(
		'https://api.example.com/v1/' . rawurlencode( $endpoint ),
		array(
			'timeout' => 10,
			'headers' => array(
				'Authorization' => 'Bearer ' . MY_SERVICE_API_KEY,
			),
		)
	);
}

ここでつまずきやすいのが「うっかり外に出す」経路です。

  • wp_localize_script() や wp_add_inline_script() でJavaScriptに渡した値は、ページのソースから誰でも読めます。シークレットはサーバー側の処理だけで使います。
  • エラー時にリクエストヘッダーや送信内容をまるごと error_log() に書くと、ログにキーが残ります。
  • WP_DEBUG_LOG を true にすると wp-content/debug.log に出力され、設定によってはWebから読めます。WordPress 5.1以降は define( 'WP_DEBUG_LOG', '/home/user/logs/wp-debug.log' ); のようにWebルート外のパスを指定できます。
  • phpinfo() の出力には環境変数が表示されます。調査用に置いたファイルは作業後に削除してください。

市販・配布プラグインの中には、設定画面ではなく wp-config.php の定数でキーを指定できるもの(WP Mail SMTP など)もあります。対応している定数名はプラグインのバージョンで変わることがあるため、各プラグインの公式ドキュメントで確認してください(2026年10月現在)。

Webからのアクセスを遮断する

Webルートの外に置けない環境(共用サーバーの構成上の制約など)では、Webサーバー側で .env へのアクセスを拒否します。外に置いた場合も、念のため設定しておくと安心です。

# Apache 2.4(.htaccess またはバーチャルホスト設定)
<Files ".env">
    Require all denied
</Files>
# Nginx:.well-known 以外のドットファイルを拒否する
location ~ /\.(?!well-known) {
    deny all;
}

設定後は curl -I https://example.com/.env を実行し、403 か 404 が返ることを確認します。200 が返る場合は設定が効いていません。

Gitに含めない・漏れたら差し替える

.gitignore に .env を加え、リポジトリには .env.example(ダミー値だけのひな形)を置いて、どのキーが必要かを共有します。

.env
.env.*
!.env.example

それでも誤ってコミットしてしまった場合は、履歴から削除するだけでは不十分です。すでに複製や取得をされている可能性があるため、まず発行元の管理画面でキーを無効化して再発行し、そのうえで git filter-repo などで履歴を整理します。gitleaks のようなシークレット検出ツールをコミット前やCIで動かすと、混入を早い段階で止められます。

まとめ

  • APIキーは .env かサーバーの環境変数に置き、.env はドキュメントルートの外に置く。
  • wp-config.php で定数に読み込み、プラグインやテーマは定数だけを参照する。
  • JavaScriptへの受け渡し、ログ、debug.log、phpinfo() など、意図しない出力経路をふさぐ。
  • .gitignore で除外し、漏れたら「無効化と再発行」を最初に行う。

お気軽にご相談ください

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