PHPアプリケーションがデータベース接続を確立するとき、もちろん一般にログインとパスワードを渡す必要があります。自分のアプリケーションに最低限必要なログインを1つだけ使用している場合、PHPはそのログインとパスワードをどこかに知っている必要があります。そのパスワードを保護するための最善の方法は何ですか? PHPコードで記述するだけではお勧めできません。
何人かの人々はこれをデータベースにstoreパスワードにする方法についての質問として誤解しています。それは間違いです。それはあなたがにデータベースを得ることを可能にするパスワードを保存する方法についてです。
通常の解決策は、パスワードをソースコードから設定ファイルに移動することです。それから管理を任せ、その設定ファイルのセキュリティをシステム管理者に任せます。そのため開発者は本番用パスワードについて何も知る必要がなく、ソース管理にパスワードの記録もありません。
あなたが他の誰かのサーバーでホストしていて、あなたのウェブルートの外にアクセスできない場合は、あなたはいつでもあなたのパスワードやデータベース接続をファイルに入れて、それから.htaccessを使ってファイルをロックすることができます:
<files mypasswdfile>
order allow,deny
deny from all
</files>
最も安全な方法は、PHPコードで指定されている情報をまったく使用しないことです。
Apacheを使用している場合は、httpd.confまたは仮想ホストファイルファイルに接続詳細を設定することを意味します。そうしておけば、パラメータなしでmysql_connect()を呼び出すことができます。つまり、PHPは自分の情報を出力しません。
これらのファイルでこれらの値を指定する方法は次のとおりです。
php_value mysql.default.user myusername
php_value mysql.default.password mypassword
php_value mysql.default.Host server
それから、次のようにMySQL接続を開きます。
<?php
$db = mysqli_connect();
またはこのように:
<?php
$db = mysqli_connect(ini_get("mysql.default.user"),
ini_get("mysql.default.password"),
ini_get("mysql.default.Host"));
Webルート以外のファイルに保存してください。
非常に安全なシステムでは、データベースパスワードを設定ファイルで暗号化します(これ自体はシステム管理者によって保護されています)。アプリケーション/サーバーの起動時に、アプリケーションはシステム管理者に復号化キーを要求します。その後、データベースパスワードは設定ファイルから読み取られ、復号化されて、将来の使用に備えてメモリに保存されます。復号化されたメモリに保存されているので、まだ100%安全というわけではありませんが、ある時点で「十分に安全」と呼ぶ必要があります。
この解決策は、オープンソースアプリケーションとクローズドソースアプリケーションの両方に役立つという点で一般的です。
利点:
この方法はHerokuによって提案されています。
資格情報が格納されているのと同じファイルにデータベース接続を作成できる場合。 connectステートメントで資格情報をインライン化します。
mysql_connect("localhost", "me", "mypass");
それ以外の場合は、connectステートメントの後に信任状を設定解除するのが最善です。なぜなら、メモリー内にない信任状は メモリーからの読み取り ;)にはなれないからです。
include("/outside-webroot/db_settings.php");
mysql_connect("localhost", $db_user, $db_pass);
unset ($db_user, $db_pass);
データベースにアクセスするにはパスワードが必要だと言うので、選択肢は限られています。一般的な方法の1つは、メインスクリプトではなく、ユーザー名とパスワードを別々の設定ファイルに保存することです。それからそれをメインのWebツリーの外に保存してください。あなたのphpファイルが実行されるのではなく単にテキストとして表示されたままになるというWeb設定の問題があるなら、それはあなたがパスワードを露出していないということでした。
それ以外のあなたは使用されているアカウントへの最小限のアクセスで正しい行にいます。それに追加
ピーター
PostgreSQLを使用している場合は、~/.pgpass
内でパスワードを自動的に検索します。詳しくは マニュアル を参照してください。
以前はDB user/passを設定ファイルに保存していましたが、それ以来、偏執的モードを打ちました - Defense in Depthの方針を採用しました。
あなたのアプリケーションが危険にさらされている場合、ユーザはあなたの設定ファイルへの読み取りアクセス権を持つことになるので、この情報を読むクラッカーの可能性があります。設定ファイルはバージョン管理に巻き込まれたり、サーバーにコピーされたりすることもあります。
Apache VirtualHostで設定された環境変数にuser/passを格納するように切り替えました。この設定はrootだけが読むことができます - おそらくあなたのApacheユーザーはrootとして実行されていません。
これとの矛盾は、パスワードがGlobal PHP変数に入っていることです。
このリスクを軽減するために、以下の予防策があります。
phpinfo()
は無効になっています。 PHPInfoは、環境変数を含むすべての概要を把握するための簡単なターゲットです。データベースのパスワードをファイルに入れ、ファイルを提供するユーザーには読み取り専用にします。
Phpサーバープロセスがデータベースにアクセスすることだけを許可する何らかの手段がない限り、これはあなたができるほとんどすべてです。
ブラウザからのパスワードではなく、データベースのパスワードについて話しているのであれば、標準的なやり方ではデータベースのパスワードをサーバ上のPHP configファイルに入れることです。
パスワードを含むphpファイルに適切な権限があることを確認する必要があります。すなわちWebサーバーとあなたのユーザーアカウントからしか読めないはずです。
このようにして解決しました。
追加のトリックは、次のようなPHP個別の設定ファイルを使用することです。
<?php exit() ?>
[...]
Plain text data including password
これはアクセス規則を適切に設定することを妨げません。しかし、あなたのWebサイトがハッキングされた場合、 "require"または "include"は最初の行でスクリプトを終了するだけなので、データを取得することはさらに困難です。
それにもかかわらず、Web経由でアクセスできるディレクトリに設定ファイルを置かないでください。あなたはあなたのコントロールコード、css、写真そしてjsを含む "Web"フォルダを持つべきです。それで全部です。それ以外はオフラインフォルダに入ります。
最善の方法は、パスワードをまったく保存しないことです。
たとえば、Windowsシステムを使用していてSQL Serverに接続している場合は、現在のプロセスのIDを使用して、統合認証を使用してパスワードなしでデータベースに接続できます。
パスワードで接続する必要がある場合は、まずencryptそれを使用して、強力な暗号化(AES-256を使用してから暗号化キーを保護する、または非対称暗号化を使用してOSに証明書を保護させる)を使用します。その後、強いACLを使用して(Webディレクトリの外側の)構成ファイルに保存します。
それを設定ファイルのどこかに置くだけで、普通に行われます。ちょうどあなたを確認してください: