WEB サーバーは、ソース コードを読み取って実行できる必要があります。これは、誰かが書いたコードがサーバーによって実行される場合、Web サーバーもソース コードを読み取ることができることを意味します。共有ホスティングの最大のリスクは、WEB サーバーが共有されるため、他の開発者が作成した PHP コードが任意のファイルを読み取れることです。
りー
ソース コードが存在するホスト上で上記のスクリプトを実行すると、攻撃者は、ファイル値をフル パスとファイル名として指定して、WEB サーバーに任意のファイルを読み取って表示させることができます。たとえば、スクリプトの名前が file.php で、ホスト example.org にあると仮定すると、ファイル /path/to/source.php の内容は、次のリンクにアクセスすることで公開できます:
http: //www.php .cn/
もちろん、この単純なコードが機能するには、攻撃者はソース コードの場所を正確に知る必要がありますが、攻撃者はファイル システム全体を参照できるようにするより複雑なスクリプトを作成する可能性があります。このようなスクリプトについては、この章で後述する例を参照してください。
この問題に対する完璧な解決策はありません。第 5 章で説明したように、ホーム WEB ディレクトリの外に保存されているコードも含め、すべてのソース コードが公開されることを考慮する必要があります。
最善のアプローチは、すべての機密データをデータベースに保存することです。これにより、コードの記述がさらに複雑になりますが、機密データの漏洩を防ぐ最善の方法です。残念ながら、別の問題があります。データベースアクセスパスワードを保存するにはどうすればよいですか?
Web サイトのメイン ディレクトリの外に保存された db.inc という名前のファイルを見てください:
<?php header('Content-Type: text/plain'); readfile($_GET['file']); ?>
ファイルへのパスがわかっている (または推測されている) 場合、サーバー上の別のユーザーがファイルにアクセスしてデータベースにアクセスし、データベースに保存したすべてのデータが公開される可能性があります。
この問題に対する最善の解決策は、データベースのアクセス許可を、システム管理者のみが読み取れるファイルに次の形式で保存することです: SetEnv は Apache コマンドで、それぞれデータベースのユーザー名とパスワードを表す 2 つの Apache 環境変数を作成します。もちろん、このトリックの重要な点は、システム管理者だけがファイルを読み取ることができるということです。システム管理者としてログインできない場合は、上記と同様の保護方法で、自分だけがファイルを読み取れるように制限することができます。
りー
これにより、悪意のあるスクリプトによるデータへのアクセスが効果的に防止されるため、データベースに保持されている機密データのセキュリティに重大なリスクが発生することはありません。
このファイルが機能するには、PHP を通じてそのデータにアクセスできる必要があります。この目標を達成するには、httpd.conf に次の包括的な文を記述する必要があります:
<?php $db_user = 'myuser'; $db_pass = 'mypass'; $db_host = 'localhost'; $db = mysql_connect($db_host, $db_user, $db_pass); ?>
このステートメントは VirtualHost に挿入する必要があることに注意してください。エリア以外の場合は、他のユーザーが対応するコンテンツを取得できます。
Apache の親プロセスはシステム管理者として実行されるため (ポート 80 にバインドする必要がある)、構成ファイルを読み取ることができますが、サーバー要求を処理する (PHP スクリプトを実行する) 子プロセスはファイルを読み取ることができません。
これら 2 つの変数には、$_SERVER スーパー グローバル配列を介してアクセスできるため、db.inc では、データベース権限を指定する代わりに、$_SERVER 変数を参照するだけで済みます。
ファイルが公開されても、データベースへのアクセスは危険にさらされません。これは共有ホスティングのセキュリティを大幅に改善するものであり、独立ホスティングの徹底した防御方法でもあります。
上記の手法を使用する場合、データベースのアクセス権は $_SERVER スーパー パブリック配列に配置されることに注意してください。これには、一般の訪問者が phpinfo() を実行して表示することや、$_SERVER の内容が公開されるその他の理由を制限することも必要です。
もちろん、この手法を使用して (データベース アクセスだけでなく) あらゆる情報を保護することもできますが、特にこの手法ではホスティング プロバイダーの支援が必要なため、ほとんどのデータをデータベースに保存する方が便利だと思います。
上記は PHP セキュリティ ソース コードの暴露 (2) の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。