質問: MySQL PHP Apache の構成でWebアプリを作っています。 パーフェクトPHPの本にあった独自のフレームワークを使用しているのですが、 アプリケーション起動時にMySQLのパスワード等各種設定を以下の様にしてありました。 ``` $this->db_manager->connect('master', array( 'dsn' => 'mysql:dbname=my_db;host=localhost', 'user' => 'root', 'password' => 'mypassword', )); ``` 上記の様にcode内に直接パスワードをが記載されると誤って公開Git等に上がると危険である事、 また、環境毎に設定の変更が必要な為、このように改修してみました。 ``` $this->db_manager->connect('master', array( 'dsn' => $_SERVER['SQL_DNS'], 'user' => $_SERVER['SQL_USER'], 'password' => $_SERVER['SQL_PASS'], ));``` ``` つまり http.conf の環境変数に MySQLのパスワード等を設定したのですが、これはセキュリティ上危険でしょうか? 一応、ソースコード内に phpinfo() 等が入らない様にして、環境変数が漏れないよう管理はしておりますが、このほかに良い方法があれば、教えてくださると助かります。 一応、自分では ``` require "../../secret.php"; ``` という様に非公開フォルダにパスワードだけ変数指定したファイルを読み込ませる、等も過去行ったのですが、フレームワーク自体の使い方が甘く、至る所で require が必要になってしまい辞めた経験があります。 またrequireをするにも、公開ファイル内に記載し、 .gitignore を使って該当ファイルのみは別で管理するという方法もありそうですが、管理している存在自体を忘れそうでこれも採用しませんでした。 つきましては一般的なcode内のパスワード管理方法について教えてくだされば幸いです。
回答: UnitTestはしない前提、composerパッケージなどのコマンドラインからDBアクセスをするようなPHPを実行しない前提ならよいと思います。ある程度大きなプロジェクトになってくると、複数の会社や外部エンジニアに手伝ってもらうことが多々ありますが、トリッキーなことをすると説明がめんどくさいと思います。 流行りのフレームワークではプロジェクト内の`config/database.php`などに置かれていることが多いので`config`ディレクトリ内にDBパスワードが見つけられないとなると、いろいろ手間かと思います。質問する側も答える側も。 > > require "../../secret.php"; > > という様に非公開フォルダにパスワードだけ変数指定したファイルを読み込ませる、等も過去行ったのですが、フレームワーク自体の使い方が甘く、至る所で require が必要になってしまい辞めた経験があります。 > > またrequireをするにも、公開ファイル内に記載し、 .gitignore を使って該当ファイルのみは別で管理するという方法もありそうですが、管理している存在自体を忘れそうでこれも採用しませんでした。 > > > 普通はパスワードファイルを`require`じゃなくて、`Model`や`DB`クラスなど基底クラスを作って、DBアクセスをする側はこの`Model,DB`クラスを`use`などでインポートするやり方が一般的かと思います。 `Model,DB`などの基底クラスで`config/db.php`のようなパスワード設定を読み込むだけですので、パスワード管理は特に気にする必要はなくなります。 否定的なことを書きましたが、どれが正解!という答えはないので、開発メンバーとやりやす方法で、セキュアである程度パフォーマンスがあればそれで良いと思います。いくらセキュアでもパフォーマンスが悪いとダメですし、これは頭のいい方法だ!と思っても複雑すぎると他の人と一緒に開発しにくくなってしまいます。 どちらにしても、どこかにパスワードを書いておかなければなりませんが、それをどこに書いておくかは開発ルール、運用ルールということになると思います。 重要なのはそれぞれの**バランス**だと思います。