web-dev-qa-db-ja.com

PHPでデータベースに安全に接続するにはどうすればよいですか?

現在PHP(ファイル/var/www/website.com/public_html/functions.php内)にあります。次のようにデータベースに接続しています:

function connect(){
    $config = parse_ini_file('/var/www/website.com/db.ini');
    $con = mysqli_connect("localhost",$config['username'],$config['password'],$config['db']);
    if(!$con){
        die("Failed to connect to Database"); 
    }
    return $con;
}

/var/www/website.com/db.iniの場所

username=user123
password=pass123
db=mydb

権限あり:

-rw-r--r-- 1 root root 84 /var/www/website.com/db.ini

PHPはwww-dataまたはrootによって実行されます。

website.comのルートは/var/www/website.com/public_html/です。

これは、セキュリティの観点からPHPを使用してデータベースに接続する最良の方法ですか?このコードをオープンソースにしています。

7
maxisme

あなたのアプローチはよさそうだ。

  • 資格情報をソースコードにインラインで書き込むのではなく、別の構成ファイルに保存します。これにより、他の人とコードを共有するときに安全になり、設定ミスにより単純なPHPコードが出力されることがよくあります)場合に資格情報を保護します(これは非常に頻繁に発生します)。

  • 構成ファイルはパブリックドキュメントルートの外部にあるため、別の脆弱性(ディレクトリトラバーサルの欠陥など)がない限り、Webアプリケーションのユーザーは直接アクセスできません。

  • いずれの場合も、サーバーをrootとして実行することは避けてください。それ以外の場合、rootは任意のファイルの読み取りおよび書き込みを行うことができるため、権限モデルは無意味です。

コードで認証情報を解析する必要がないことに注意してください。代わりに、サーバー構成で PHPランタイム設定 と指定できます ここ

こちらもご覧ください:

6
Arminius

私はこの_-rw-r--r-- 1 root root_アプローチに懐疑的です。それを行う安全な方法は

  1. ファイルを_-r-------- 1 root root_、つまりユーザーのみが読み取り可能にするroot
  2. アプリをrootとして起動し、認証情報を読み取り、すぐにsetuid()を_www-data_に接続します。したがって、アプリを危険にさらす人はだれでもcannotディレクトリトラバーサル攻撃を介してでもファイルを読み取ります。もちろん、rootを取得する別の方法が見つからない場合は、とにかくゲームオーバーです。これは PHPで可能なはずです です。

これは、特権ポートであるポート80にバインドするためにWebサーバーが使用するメカニズムと同じです。

0
Gaius