PHPアプリケーションがデータベース接続を確立するときは、もちろんログインとパスワードを渡す必要があります。アプリケーションに単一の最小権限のログインを使用している場合、PHPはそのログインとパスワードをどこかに知っている必要があります。そのパスワードを保護する最良の方法は何ですか?PHPコードでそれを書くだけでは良い考えではないようです。
PHPアプリケーションがデータベース接続を確立するときは、もちろんログインとパスワードを渡す必要があります。アプリケーションに単一の最小権限のログインを使用している場合、PHPはそのログインとパスワードをどこかに知っている必要があります。そのパスワードを保護する最良の方法は何ですか?PHPコードでそれを書くだけでは良い考えではないようです。
回答:
何人かの人々はこれをデータベースにパスワードを保存する方法についての質問と誤解しています。それは間違いです。それはあなたが得ることができますパスワード保存方法についてですにデータベースを。
通常の解決策は、パスワードをソースコードから構成ファイルに移動することです。次に、管理とその構成ファイルの保護をシステム管理者に任せます。そうすれば、開発者は本番パスワードについて何も知る必要がなく、ソース管理にパスワードの記録がありません。
他の誰かのサーバーをホストしていて、webrootの外にアクセスできない場合は、いつでもパスワードやデータベース接続をファイルに入れ、.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"));
ini_get()
。
but any user (or a hacker abusing badly written php script) can read the password via ini_get()
どう対処するの?
ini_get()
またはを使用しても問題はありませんgetenv()
。
それらをWebルート外のファイルに保存します。
include('../otherDirectory/configfile.conf')
か?
非常に安全なシステムでは、データベースパスワードを構成ファイルで暗号化します(構成ファイル自体はシステム管理者によって保護されています)。アプリケーション/サーバーの起動時に、アプリケーションはシステム管理者に復号化キーを要求します。その後、データベースのパスワードが構成ファイルから読み取られ、復号化されて、将来使用するためにメモリに格納されます。復号化されたメモリに保存されるため、100%安全ではありませんが、ある時点で「十分に安全」と呼ぶ必要があります。
このソリューションは一般的であり、オープンソースアプリケーションとクローズドソースアプリケーションの両方に役立ちます。
利点:
この方法は、非常に成功しているHerokuによって提案されています。
資格情報が格納されているのと同じファイルにデータベース接続を作成できる場合。接続ステートメントに資格情報をインライン化します。
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構成の問題がある場合に、パスワードを公開していないためです。
それ以外は、使用されているアカウントへの最小限のアクセス権で正しい方向に進んでいます。それに追加
ピーター
以前は、構成ファイルにDBユーザー/パスを格納していましたが、それ以降は偏執狂モードに陥っています-多層防御のポリシーを採用しています。
アプリケーションが侵害された場合、ユーザーは設定ファイルへの読み取りアクセス権を持つため、クラッカーがこの情報を読み取る可能性があります。設定ファイルは、バージョン管理に巻き込まれたり、サーバー間でコピーされたりする可能性もあります。
Apache VirtualHostで設定された環境変数にユーザー/パスを保存するように切り替えました。この設定はrootだけが読み取ることができます-うまくいけば、Apacheユーザーはrootとして実行されていません。
これとの欠点は、パスワードがグローバルPHP変数にあることです。
このリスクを軽減するために、次の予防策があります。
phpinfo()
無効になっています。PHPInfoは、環境変数を含むすべての概要を取得するための簡単なターゲットです。ブラウザからのパスワードではなく、データベースのパスワードについて話している場合、標準的な方法は、データベースのパスワードをサーバー上のPHP構成ファイルに配置することです。
パスワードを含むphpファイルに適切な権限があることを確認する必要があるだけです。つまり、Webサーバーとユーザーアカウントのみが読み取り可能である必要があります。
このようにして解決しました:
追加のトリックは、次のようなPHPの別の構成ファイルを使用することです。
<?php exit() ?>
[...]
Plain text data including password
これにより、アクセスルールを正しく設定できます。ただし、Webサイトがハッキングされた場合、「require」または「include」は最初の行でスクリプトを終了するだけなので、データを取得するのはさらに困難です。
それでも、Web経由でアクセスできるディレクトリに設定ファイルを置かないでください。コントローラーコード、css、画像、jsを含む「Web」フォルダーが必要です。それで全部です。それ以外のものはオフラインフォルダに入ります。
require
/ include
しかし、どのように行うことを防ぐためにfopen
?
最善の方法は、パスワードをまったく保存しないことです。
たとえば、WindowsシステムでSQL Serverに接続している場合、統合認証を使用すると、現在のプロセスのIDを使用して、パスワードなしでデータベースに接続できます。
パスワード、最初に接続する必要がある場合は暗号化して、(たとえば、AES-256を使用して、暗号化キーを保護する、または証明書を保護するOSを非対称暗号化を使用して持っている)強力な暗号化を使用して、その後、Aに保管し強力なACLを含む構成ファイル(Webディレクトリ外)。