私はPHPウェブサイトに取り組んでおり、私の調査によると、サーバーがハッキングされ、PHPファイルが公開される可能性があります。 PHPファイル内の定数の形式のMySQL DBユーザー名とパスワード。これは接続文字列の形成中に使用されます。
define("HOSTNAME","hostname.com:2086");
define("DBNAME","databasename");
define("DBUSER","databaseusername");
define("DBPASS","databasepassword!");
/* Defining DB Handler */
try{
$DBH = new PDO("mysql:Host=".HOSTNAME.";dbname=".DBNAME, DBUSER, DBPASS);
$DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$DBH->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
}
catch(PDOException $e){
echo $e->getMessage();
}
いずれにせよPHPファイルが公開された場合、データベースとその内容も危険にさらされることになります。私はそれを間違っていますか?の安全性を確保するためのより良い方法はありますか? PHPファイルが公開されても、データベース?
あなたのキーを保護する良い方法は、phprootファイルに資格情報をwebroot外に置くことです。その後、「未加工」のphpファイルがクライアントに提供された場合でも、データベース資格情報は含まれません。 (サーバー上でファイルにアクセスできるユーザーからは保護されません)。
実行できるもう1つの防御策は、データベースが接続を受け入れる接続を制限することです。 (したがって、全世界ではなく、特定のIPの選択リスト)
最後に、データベースに接続するアカウントには、それ自体のデータベースに対する権限のみを付与し、その他の権限は付与しないようにする必要があります。
Defence in depth がキーワード:資格情報を保護するだけでなく、資格情報を知っていても、攻撃者にとって(ほとんど)役に立たないことを確認します。
つまり、専用の 最低限の特権を持つユーザー ( 最小特権の原則 )と そのユーザーによるアクセスを制限する をWebサーバーからのみ使用します。攻撃者がこれらの資格情報を悪用する唯一の方法はWebサーバーからであるので、資格情報をどこに保持するかは問題ではありません。つまり、攻撃者はWebサーバーでコード/コマンドを実行する必要があります。そしてその場合、あなたはすでに運命づけられています。
他の回答で述べた対策に加えて、Webサーバーから取得するファイルからユーザー名/パスワードを読み取り、このファイルをサーバー以外のすべてに対して明示的にブラックリストに登録します。
それらを環境変数に入れることができます。
セキュリティ上の利点に加えて、PHPファイルに触れたり、異なる開発環境で作業するたびに異なる資格情報を挿入したりする必要がないなど、開発ワークフローに複数の利点があります。代わりに、環境はこの情報を提供し、デプロイされた場所に自動的に適応する単一のアプリしかありません。