まず
PHPで開発していると、データベースのパスワードや外部サービスのAPIキーなど、秘密にしておきたい情報を扱う場面が必ず出てきます。
これらの情報をソースコードに直接書き込んでしまう(ハードコーディング)のは、セキュリティ上非常に危険です。
特に、Gitなどでコードを管理していると、誤ってAPIキーを公開リポジトリにプッシュしてしまうと、第三者に悪用されるリスクがあります。
そこで今回は、ライブラリを使わずに、PHPの標準機能だけで秘密情報を安全に管理する、シンプルかつ効果的な方法をご紹介します。さくらのレンタルサーバのような共用サーバーでも簡単に実践できます。
基本方針:設定ファイルは「ドキュメントルートの外」へ置く
最も重要な原則は、「Webからアクセスできる公開ディレクトリ(ドキュメントルートのこと。今回はさくらのレンタルサーバのwwwのことを指しています)の外に、設定情報を記述したファイルを置く」 ことです。
ドキュメントルート(さくらサーバーなら /home/アカウント名/www/)にファイルがあると、ブラウザから直接アクセスされる可能性がありますが、その外側に置けば、URLで直接アクセスされることはありません。
PHPスクリプトの中からのみ、サーバー内部のファイルとして読み込むことができます。
ディレクトリ構成のイメージ
/home/your_account/ <- サーバーのホームディレクトリ
├── config.php <- ★ここに設定ファイルを置く(安全な場所)
└── www/ <- ドキュメントルート(Web公開領域)
└── index.php <- ★ここから設定ファイルを読み込む
具体的な手順
手順はとてもシンプルで、2つのステップで完了します。
STEP 1:設定ファイル config.php を作成する
まず、ドキュメントルートの外(例:/home/your_account/)に、設定ファイル (config.php) を作成します。このファイルには、API KeyやDBのアクセスに必要なパスワードなど)秘密情報を定数として定義します。
<?php
// このファイルにAPIキーやDB接続情報などを定義します
define('API_KEY', 'xxxxxxxx-your-super-secret-api-key-xxxxxxxx');
// データベース接続情報の例
define('DB_HOST', 'mysqlXX.db.sakura.ne.jp');
define('DB_NAME', 'your_database_name');
define('DB_USER', 'your_database_user');
define('DB_PASSWORD', 'your_database_password');
ポイント:
変数($apiKey = ...)ではなく、define() を使って定数として定義 することをお勧めします。定数は一度定義すると変更できないため、意図しない上書きを防ぐことができます。
STEP 2:PHPスクリプトから設定ファイルを読み込む
次に、Webからアクセスされる側のPHPスクリプト(例:/home/your_account/www/index.php)から、先ほど作成した
config.php を読み込みます。
/home/your_account/www/index.php の中身
<?php
// 設定ファイルを読み込む
// __DIR__ はこのファイルがあるディレクトリを指すので、'/../'で一つ上の階層に遡る
require_once __DIR__ . '/../config.php';
// これで、config.phpで定義した定数が使えるようになります
echo '<h1>設定ファイルの読み込みテスト</h1>';
// APIキーを利用する
echo '<p>取得したAPIキー: ' . htmlspecialchars(API_KEY, ENT_QUOTES, 'UTF-8') . '</p>';
// データベースに接続する処理などで定数を利用
try {
$dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=utf8mb4';
$pdo = new PDO($dsn, DB_USER, DB_PASSWORD);
echo '<p style="color: green;">データベースに正常に接続しました。</p>';
} catch (PDOException $e) {
// 実際にはエラーメッセージを画面に出力しないようにしましょう
// error_log('DB Connection Error: ' . $e->getMessage());
die('<p style="color: red;">データベース接続に失敗しました。</p>');
}
require_once __DIR__ . '/../config.php'; の解説
この一行が処理の肝です。
require_once: 指定されたファイルを読み込みます。ファイルが見つからない場合は、処理を停止する致命的なエラー(Fatal Error)となります。設定ファイルは必須なので、include よりも require が適しています。_once は、万が一複数回読み込もうとしても、一度しか読み込まないようにするおまじないです。
DIR: PHPの「マジック定数」の一つで、このコードが書かれているファイルが存在するディレクトリの絶対パスを返します。
'/../': ディレクトリ階層を一つ上がる、という意味です。
つまり、www/index.php から見て、一つ上の階層にある config.php を絶対パスで正確に指定して読み込む、という非常に堅牢な記述になっています。
この方法のメリットと注意点
メリット
シンプル: ライブラリやComposerが不要で、PHPの基本機能だけで実現できます。
高い互換性: ほとんどすべてのPHPホスティング環境で動作します。
設定とロジックの分離: コード本体から秘密情報を分離でき、管理がしやすくなります。
注意点
規約の不在: ファイル名(config.php)や定数名に決まったルールがないため、個人開発や小規模なプロジェクト向きです。モダンなフレームワークでは .env ファイル形式が主流のため、チーム開発などではそちらの方式(phpdotenvライブラリ)を検討すると良いでしょう。
【最重要】Git管理から必ず除外すること!
この方法で最も注意すべき点です。せっかくファイルを分離しても、config.php をGitリポジトリにコミットしてしまっては意味がありません。
Gitの自身のリポジトリにアップしないよう注意して下さい
まとめ
PHPで秘密情報を扱う際は、
- 設定ファイル(
config.php)をドキュメントルートの外に作成する -
require_once __DIR__ . '/../config.php';で読み込む -
.gitignoreでGit管理対象ファイルから除外する
という3つのポイントを徹底するだけで、アプリケーションのセキュリティを大幅に向上させることができます。ライブラリ不要で今日からすぐに実践できるので、ぜひご自身のコードに取り入れてみてください。