みなさん、こんにちは!
ブリュの公式ブログ.netにお越しいただきまして、ありがとうございます。
このサイトでは、ITについて特化したサイトを運営しています。
今回は、phpで便利なinclude文の構文と、相対パスと絶対パスについて解説します。
また、サイバーセキュリティの観点から見た危険性について紹介します。
目次
phpのinclude
phpのインクルード文は、次のように書きます。
1 2 3 |
<? php include "読み込むファイルのパス"; ?> |
読み込むファイルのパスには、相対パスや、絶対パスが使用できます。
相対パスでinclude
相対パスでincludeする場合には、()内にPHPを実行しているファイルからの相対パスを書きます。
1 2 3 |
<? php include("/sample.php"); ?> |
これによってincludeができます。
なお、PHPを実行しているファイルからの相対パスであることに注意してください。
イメージは下の図のようになります。
sample1.phpを実行する際にsample2.phpをincludeする場合には、相対パスは/sample2.phpになります。
しかし、index.phpでsample1.phpをincludeして、さらにsample1.phpでsample2.phpをincludeする場合には、相対パスはindex.phpから見たものが必要で、/sample/sample2.phpとなります。
絶対パスでinclude
相対パスはサーバー移転の際に変更になる可能性もありますし、なにより複数のPHPファイルを読み込む場合には、基準となるPHPファイルからの相対パスを考えるのは面倒です。
そこで、自動でドキュメントルートパスを取得する、$_SERVER[‘DOCUMENT_ROOT’]やdirname(__FILE__)を使って次のように書いたりします。
1 2 3 4 |
<? php include $_SERVER['DOCUMENT_ROOT'] . "test.php"; include dirname(__FILE__) . "test.php"; ?> |
phpにおける文字列の結合は、「.」で表します。
絶対パスによるイメージを図で示しました。
絶対パスを使うことで、実行ファイルのパスを考慮する必要がなくなるので、PHPアプリケーション作成時のバグを減らすことができ、開発スピードを向上させることができます。
また、サーバーの環境変数に一切依存しないのも魅力です。
$_SERVER[‘DOCUMENT_ROOT’]は、ドメインのルートを取得するスーパーグローバル変数です。
また、__FILE__は、自身のフルパスが出力されます。
dirnameは、パスの中のファイル名の部分を削除するものです。
よって、dirname(__FILE__)とすることで、自分自身のディレクトリパスが帰ってきます。
これらを用いることで、将来的なサーバー移転を行う際にも、サーバーの環境に左右されないphpコードができるので、柔軟な対応が可能になります。
動的includeは危険
サイトの訪問者は全員疑え!
動的includeは非常に危険です。
動的includeとは、サイト閲覧者に何かしらの情報を入力させ、それに対応したファイルをincludeするものです。
サイトの閲覧はどこで行われているかわかりません。
サイトの閲覧者が全員健全な方だと言い切れますか?
残念なことに、悪意を持った人が存在する可能性は否定できません。
そんな方の入力した文字をそのままincludeすると、非常に危険です。
includeは相対パスの表記ができる。
includeでは、先に説明したように絶対パスと、相対パスの表記ができます。
サーバー内の次のような階層構造を考えます。
ユーザーにA~Cで選択させ、どれかを読み込むとします。
そこで、次のinclude文を考えましょう。
$valueには、ブラウザで入力された値が入っていると思って下さい。
1 2 3 4 |
<? php $value = $_POST['value']; include $_SERVER['DOCUMENT_ROOT'] . $value; ?> |
このコードは非常に危険です。
本当にユーザーがA,B,Cのどれかを入力しますか?
../で壊滅的被害が出る
悪意あるユーザーが、../secret.phpと動作するように入力したとします。
先ほどのphpコードの$valueを次のコードになることがわかりますか?
1 2 3 4 |
<? php $value = $_POST['value']; //$value=../secret.php include $_SERVER['DOCUMENT_ROOT'] . $value; //秘密ファイルが読み込まれる。 ?> |
このsecret.phpにサーバーの情報や、ユーザーの個人情報が格納されたいた場合には、とてつもない被害になります。
個人サイトなら関係ないだろうと思うかもしれません。
しかし、WordPressの場合には、wp-config.phpが狙われると、データベースが攻撃されてしまい、サイトが破壊されます。
include文は非常に便利なものですが、動的に使う場合には細心の注意が必要です。
ただのincldeなら大丈夫そう
HTMLの一部を外部化するなどのサーバー側で完結するinclude文なら、おそらくリスクは小さいでしょう。
ただし、リスクは絶対にないと言い切れないのがインターネットの世界です。
日頃からバックアップを取り、いつでもサイトを復旧できる体制にしておきましょう。
phpのincludeのまとめ
ここまで、phpのinclude文について紹介してきました。
phpのことを紹介している他サイト様は多いですが、phpに潜んでいる危険性までを解説しているサイト様は少ないでしょう。
ここで書いたこともすべてではありません。
攻撃者の目線に立って、自分のサイトに攻撃を仕掛ける場合、どこに弱点があるかを考えながらサイト運営を行いましょう。
以上、phpのinclude文について、参考になれば幸いです。