今回、初めてサーバー上に PHP + MySQL のDB接続を行うツールをデプロイしました。
ローカル(XAMPP)では問題なく動いていたものの、本番に上げる段階でこんな疑問にぶつかりました。
- DB接続情報(config)はどこに置くのが正解?
- www配下に置いていいの?
- URLから直接見えてしまったりしない?
正直、Webサーバーの公開範囲や仕組みをよくわかっておらず、「接続情報は隠さなきゃ」と思いつつ、はっきりとした判断ができませんでした。
この記事は、そのときに学んだ内容を整理したものです。
※本記事では、www / public_html のような 公開ディレクトリ(ドキュメントルート)を持つ一般的なWebサーバー構成を前提にしています。
そもそも、どこまでがURLでアクセスできるの?
configの置き場所を考える中で、まず分かっていなかったのが、
ブラウザからURLでアクセスできるのは、サーバー上のどこまでなのか?
という点でした。
一般的には、Webサーバーは 「ドキュメントルート」と呼ばれるディレクトリ配下だけを、ブラウザからアクセスできるように公開します。
多くの環境では www や public_html がドキュメントルートとして使われることが多いです。
/home/username/
├─ www/ ← ブラウザからアクセスできる範囲(公開ディレクトリ)
│ └─ index.php
└─ config/ ← URLでは到達できない範囲(ドキュメントルート外)
この構成だと、
-
www配下 → URLでアクセスできる -
wwwの外 → URLではアクセスできない
となります。
一方で、PHPの require / include は URLではなくファイルシステム上のパスを読み込む仕組みなので、www の外にあるファイルでも読み込めます。
configはwww外に置ける(公開面から切り離せる)
ここまで整理できて、ようやく次のように考えられました。
- URLでアクセスできない場所に
- DB接続情報を置いて
- PHPからだけ読み込めばよいのでは?
つまり、configをドキュメントルート(www)の外に置くと、HTTP公開面から切り離せてより安全、という考え方です。
例えばこんな構成(www外にconfigを置く)
/home/username/
├─ config/db.php
└─ www/index.php
require_once __DIR__ . '/../config/db.php';
この構成のメリットとしては、
- URLで直接アクセスできない(ドキュメントルート外)
-
.htaccessに依存しない - 公開事故のリスクを下げやすい
といった点が挙げられます。
今回採用した構成(www配下 + .htaccess)
一方で、今回の環境では、
- www外に置く構成を自分の言葉でまだ説明しきれなかった
- まずは「URLで叩けないこと」を目で確認できる形にしたかった
という理由から、www配下に置き、.htaccess でアクセス拒否する方法を採用しました。
/www/config/db.php
/www/config/.htaccess
.htaccess
Require all denied
※Deny from allというのも見かけましたが、現在は上記が一般的なようです。
アプリ側では通常どおり require します。
require_once __DIR__ . '/../config/db.php';
この状態で、
-
https://(ドメイン)/config/db.phpをURLで直接叩く - Forbiddenになることを確認
というチェックを行いました。
補足:今回の構成について(local / 本番の切り替え)
今回の環境では、DB接続情報は db.php にまとめ、ローカル(XAMPP)と本番(サーバー)で定義を切り替える形にしています。
切り替えは HTTP_HOST を使って行い、db.php には接続情報の定義のみを持たせています。
実際のDB接続処理は共通関数ファイル(functions.php)にまとめ、そこから db.php を読み込む構成にしています。
※環境変数(.env)やサーバー側設定で切り替える方法も今後勉強したいと思います。
今回の学び
- 一般的には、URLでアクセスできる範囲はドキュメントルート配下に限定される
- PHPの
requireはURLではなくファイルパスを見る - configをwww外に置くと、HTTP公開面から切り離せてより安全
- www配下 +
.htaccessで守る方法もある - 最後は「URLで叩いてForbiddenになるか」を自分で確認すると安心できる
まとめ
今回は 「初めてのDB接続デプロイ」 だったため、まずは「自分が理解できる範囲で安全を確保する」方法を選びました。
今後は、www外にconfigを置く構成にも挑戦してみたいと思っています。
同じように「configどこに置けばいいの?」で止まった人の整理のヒントになれば嬉しいです。