質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • PHP

    20376questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    5863questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • Apache

    1822questions

    Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

  • Git

    1285questions

    Gitはオープンソースの分散バージョン管理システム(DVCS)です。

MySQLパスワード等のコード内での管理方法について

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 718

sakamata

score 57

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内のパスワード管理方法について教えてくだされば幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

つまり http.conf の環境変数に MySQLのパスワード等を設定したのですが、これはセキュリティ上危険でしょうか?

良い案の一つだと思いますよ。
ただし、MySQLのパスワードをApacheが知ってるってのは微妙な気もしますね。
例えばバーチャルドメインで複数サービスを立ち上げるようなケースでは干渉するかもしれないので、気をつけてください。

まぁ、何かしらのファイルにMySQLのパスワード等の情報が載るので、
どうやって管理するべきかに関しては答えがないものとなります。


上記の様にcode内に直接パスワードをが記載されると誤って公開Git等に上がると危険である事、
また、環境毎に設定の変更が必要な為、このように改修してみました。 

Gitは変更した全ての記録を持っているので、
パスワードが含まれているコミットはコミット履歴を統合して潰すようにしておいてくださいね。
知識のある人には簡単に抜かれますので、念入りに確認してください。

まぁ、BitBucketやGitHub(有料プラン)のプライベートリポジトリを借りてノーガード戦法というゴリ押しもありだと思います。

非公開フォルダにパスワードだけ変数指定したファイルを読み込ませる、等も過去行ったのですが、フレームワーク自体の使い方が甘く、至る所で require が必要になってしまい辞めた経験があります。

このケースでは、定数として宣言する案があります。
この場合必ずスタートするindex.phpに1行放り込んでおけば何時でも何処でもパスコードが利用出来ます。

このほかに良い方法があれば、教えてくださると助かります。

他と比べて特別優れているわけではありませんが、環境変数を使う案もあります。
getenv - PHP Manual

Dockerではオーバーヘッドの少ない仮想マシンを立ち上げて、
1アプリ1仮想マシン(コンテナ)で動作させますので、
この環境変数に値を突っ込んで起動するというのは綺麗にハマります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/21 18:03

    回答ありがとうございます。
    悪くない方法と伺えてとても安心できました。
    過去Gitにあげてしまったパスワードは消すなり変更するなりするのが必須ですね。
    改めて気を付けるようにいたします。
    また定数として宣言し、index.php にrequireを書くという方法も、考えてみればその通りですね。
    応用としての発想に至らない事が多くこれも大変参考になりました。
    また、getenv()での記載は $_SERVER['hoge’] 同じ結果になる様ですね。
    個人的には大文字でうやうやしく宣言している方が特殊な事をしている感じがあって好みです。
    色々な方向性を示してくださりありがとうございました。
    とても参考になりました。

    キャンセル

+1

UnitTestはしない前提、composerパッケージなどのコマンドラインからDBアクセスをするようなPHPを実行しない前提ならよいと思います。ある程度大きなプロジェクトになってくると、複数の会社や外部エンジニアに手伝ってもらうことが多々ありますが、トリッキーなことをすると説明がめんどくさいと思います。

流行りのフレームワークではプロジェクト内のconfig/database.phpなどに置かれていることが多いのでconfigディレクトリ内にDBパスワードが見つけられないとなると、いろいろ手間かと思います。質問する側も答える側も。

require "../../secret.php";
という様に非公開フォルダにパスワードだけ変数指定したファイルを読み込ませる、等も過去行ったのですが、フレームワーク自体の使い方が甘く、至る所で require が必要になってしまい辞めた経験があります。
またrequireをするにも、公開ファイル内に記載し、 .gitignore を使って該当ファイルのみは別で管理するという方法もありそうですが、管理している存在自体を忘れそうでこれも採用しませんでした。

普通はパスワードファイルをrequireじゃなくて、ModelDBクラスなど基底クラスを作って、DBアクセスをする側はこのModel,DBクラスをuseなどでインポートするやり方が一般的かと思います。

Model,DBなどの基底クラスでconfig/db.phpのようなパスワード設定を読み込むだけですので、パスワード管理は特に気にする必要はなくなります。

否定的なことを書きましたが、どれが正解!という答えはないので、開発メンバーとやりやす方法で、セキュアである程度パフォーマンスがあればそれで良いと思います。いくらセキュアでもパフォーマンスが悪いとダメですし、これは頭のいい方法だ!と思っても複雑すぎると他の人と一緒に開発しにくくなってしまいます。

どちらにしても、どこかにパスワードを書いておかなければなりませんが、それをどこに書いておくかは開発ルール、運用ルールということになると思います。

重要なのはそれぞれのバランスだと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/21 17:54

    大変参考になるご回答、ありがとうございます。
    フレームワークでは```config/database.php``` というパターン等もあるのですね。
    基底クラスを作ってuse でインポートという方法もありというのも、初めての認識でした。
    たしかに開発時のコンセンサスや運用時の状況に応じて、様々な方法とバランスがあるという見識を
    得られ、自分の方向性があながち間違っていないことを認識できました。
    ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    PHP DBから抽出データ、配列、SESSION、class

    はじめに たぶん、何やってんだろう?という質問内容かと思いますが、アドバイスをいただければと思います。 やりたいこと 漠然としてはいますが、たぶんclassを作るのに、す

  • 解決済

    MYSQLの基本的なご質問

    現在Companyテーブルには id companyname  sales 1  A company 2  B company 3  C company 4  D com

  • 解決済

    DBのテーブルそのものを配列に入れたい

    ターミナルで下記コマンドで、そのDBのテーブルが何という名前で何個あるかがみれます。 show tables; これをPHP上で行いたいのです。 イメージではこん

  • 解決済

    php、mysqlでのエラー

    前提・実現したいこと php&mysql(maria?)&htmlでサイトを作成中です。接続ができていないのですかね...。 ソースはできるだけ簡単にしました。この状態でも同じ

  • 受付中

    MySQL : insertがうまくいかない

    PHPからMySQLに接続し、何個かテスト用にデータをinsertしようとしました。 function debugPrint($var) { echo '<pre>';

  • 受付中

    PHPのエラーの原因がわかりません。

    <?php define('DB_DATABASE', 'TaskManagement'); define('DB_USERNAME', 'user'); define('DB_P

  • 受付中

    配送リスト管理システのコード(php)

    現在配送システムの管理ページを政策しているのですが、エラーが出まくっていて先に進めません、、、以下エラー内容です。 Parse error: parse error, expe

  • 解決済

    ログインロリポップでのデータベースエラーについて

    ローカル環境では、問題なく動くのですが、 サーバーにアップした後動きません。 下記のエラーが表示されます。 Can't connect to local MySQL serve

同じタグがついた質問を見る

  • PHP

    20376questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    5863questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • Apache

    1822questions

    Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

  • Git

    1285questions

    Gitはオープンソースの分散バージョン管理システム(DVCS)です。